【问题标题】:How calculate checksum using 8-bit addition of all bytes in the data structure如何使用数据结构中所有字节的 8 位加法计算校验和
【发布时间】:2014-10-15 20:34:05
【问题描述】:

我需要从字节数组中计算校验和。它的一些串口数据包。我只有这段文字:

校验和是使用数据结构中所有字节的 8 位相加计算得出的。不考虑溢出(1 个字节)。

8位加法怎么做?

在 C# 中需要它。

【问题讨论】:

  • 听起来像一个很弱的校验和。
  • @Jonas Elfström:你能解释一下吗?这不是我的协议,而是我需要与之通信的一些设备协议。但我什至不明白什么是 8 位加法:(
  • 字节为 {255, 1, 250} 的文件将具有与 {10, 90, 150} 或 {255, 255, 252} 相同的 校验和 等等开。
  • 但如果协议是这么说的,那么你就无能为力了。
  • 是的,这就是协议的问题:/

标签: c#


【解决方案1】:

直接加法?好吧,你可以很容易地遍历所有字节:

public static byte ComputeAdditionChecksum(byte[] data)
{
    byte sum = 0;
    unchecked // Let overflow occur without exceptions
    {
        foreach (byte b in data)
        {
            sum += b;
        }
    }
    return sum;
}

或者,使用 LINQ:

public static byte ComputeAdditionChecksum(byte[] data)
{
    long longSum = data.Sum(x => (long) x);
    return unchecked ((byte) longSum);
}

我正在使用long 来避免在长流上溢出 - 我假设它会小于 255 字节 :) 在实践中,使用 @987654324 可能会很好@ 而不是 long

【讨论】:

  • 你能解释一下未经检查的语法吗?
  • @Simon:它将算术放入未经检查的上下文中:即使程序集的其余部分使用检查的算术(即在算术溢出时抛出 OverflowException),这段代码也不会。
  • 所以我只是将所有字节汇总在一起,如果溢出我会得到什么?
  • @Simon:它只会忽略任何更高的位 - 例如,255 + 3 将给出 2。
  • 另一种常见的做法是将字节异或在一起。
【解决方案2】:

LINQ 解决方案

public static byte CheckSum(byte[] array)
{
     return array.Aggregate<byte, byte>(0, (current, b) => (byte) ((current + b) & 0xff));
}

【讨论】:

    【解决方案3】:

    在C#中,将数据读入字节类型数组,并将所有字节添加到一个单独的字节变量中以获得校验和结果。

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      相关资源
      最近更新 更多