0

给定一个字节数组

byte[] someBytes = { 0xFF, 0xFE, 0xFE, 0xFF, 0x11, 0x00 ,0x00 ,0x00 ,0x00}

将所有字节相加最好的是什么?在上面的示例中,手动将所有字节手动添加为十六进制数字会产生 40B,所以最好我希望得到类似的结果:

byte[] byteSum = { 0x04, 0x0B }

实际上,我真正需要的只是 0x0B 部分(用于校验和)。在这种情况下,校验和由 0x0B XOR 0x55(产生 0x5E)计算。

我知道这不是正常的字节添加,但这是计算校验和的方式。

手动循环遍历字节数组并将它们相加得到整数和。

这样做最简洁的方法是什么?

4

3 回答 3

2

嗯,

byte checksum;
foreach (var b in someBytes)
{
    checksum = (byte)((checksum + b) & 0xff);
}
于 2013-07-11T08:44:38.920 回答
2

我不确定我是否理解你的问题......但这就是我的做法:

byte sum = 0;
foreach (byte b in someBytes)
{
    unchecked
    {
        sum += b;
    }
}

但这不会产生 0x0B,而是 0x69。

于 2013-07-11T08:47:22.540 回答
1

最后使用 LINQ 的 sum 并转换为byte

unchecked
{
    var checksum = (byte)(someBytes.Sum(b => (long)b) ^ 0x55);
}
于 2013-07-11T10:58:05.667 回答