给定一个字节数组
byte[] someBytes = { 0xFF, 0xFE, 0xFE, 0xFF, 0x11, 0x00 ,0x00 ,0x00 ,0x00}
将所有字节加起来最好的是什么?手动将所有字节手动添加为十六进制数字将在我上面的例子中产生40B,所以我最好还是喜欢这样的结果:
byte[] byteSum = { 0x04, 0x0B }
实际上,我真正需要的只是0x0B部分(用于校验和)。在这种情况下,校验和由0x0B XOR 0x55(产生0x5E)计算。
我知道这不是正常的字节添加,但这就是校验和的计算方法。
手动循环字节数组并添加它们会产生整数和。
这样做最简洁的方法是什么?
答案 0 :(得分:2)
ERM,
byte checksum;
foreach (var b in someBytes)
{
checksum = (byte)((checksum + b) & 0xff);
}
答案 1 :(得分:2)
我不确定我是否理解你的问题...但这就是我要做的事情:
byte sum = 0;
foreach (byte b in someBytes)
{
unchecked
{
sum += b;
}
}
但这不会产生0x0B,而是产生0x69。
答案 2 :(得分:1)
最后使用LINQ的总和并转换为byte
:
unchecked
{
var checksum = (byte)(someBytes.Sum(b => (long)b) ^ 0x55);
}