【问题标题】:How to add multiple bytes and get a byte array?如何添加多个字节并获得一个字节数组?
【发布时间】:2013-07-09 10:47:24
【问题描述】:

给定一个字节数组

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

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

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

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

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

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

最简洁的方法是什么?

【问题讨论】:

  • 您将需要使用模运算符:0x040B % 0x0100 == 0x000B 模运算符将一个数字与另一个数字相除,然后返回除法的其余部分。
  • @Nolonar 一旦我弄清楚如何获得 0x040B 应该非常有用:D 谢谢
  • 我不明白添加应该如何产生 0x40B。总和为 1129 或 0x469。您对“添加”的定义是什么?
  • @SebastianNegraszus 哦,对不起,5E 实际上是前 9 个字节的校验和,然后是 0x55 异或。我会把它添加到细节中。

标签: c# .net hex byte


【解决方案1】:

嗯,

byte checksum;
foreach (var b in someBytes)
{
    checksum = (byte)((checksum + b) & 0xff);
}

【讨论】:

  • 强制转换为ushort 是不必要的,因为+ 会自动升级为int
【解决方案2】:

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

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

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

【讨论】:

  • 他显然想添加字节,当它溢出时,创建一个新字节,因此字节数组。
  • 未选中可避免强制转换和掩码,+1,幸运的是字节没有符号。
【解决方案3】:

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

unchecked
{
    var checksum = (byte)(someBytes.Sum(b => (long)b) ^ 0x55);
}

【讨论】:

  • @Jodrell 鉴于当前 CLR 中数组的最大大小为 20 亿字节,这显然是不可能的。它也大于当前 AMD64 CPU 的最大 RAM 大小。在我选择 long 而不是 int 的原因中避免溢出。
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2013-05-10
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多