C# 如何使用数据结构中所有字节的8位加法计算校验和

C# 如何使用数据结构中所有字节的8位加法计算校验和,c#,C#,我需要从字节数组计算校验和。它是一些串行端口数据包。我刚才说: 校验和是使用数据结构中所有字节的8位加法计算的。不考虑溢出(1字节) 如何实现8位加法 需要用C#.直接加法吗?您可以非常轻松地迭代所有字节: public static byte ComputeAdditionChecksum(byte[] data) { byte sum = 0; unchecked // Let overflow occur without exceptions { f

我需要从字节数组计算校验和。它是一些串行端口数据包。我刚才说:

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

如何实现8位加法


需要用C#.

直接加法吗?您可以非常轻松地迭代所有字节:

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个字节:)在实践中,您可能可以使用
int
代替C#中的
long
,将数据读取到字节类型数组中,并将所有字节添加到单独的字节变量中以获得校验和结果。

public static byte CheckSum(byte[] array)
{
     return array.Aggregate<byte, byte>(0, (current, b) => (byte) ((current + b) & 0xff));
}
公共静态字节校验和(字节[]数组)
{
返回数组。聚合(0,(当前,b)=>(字节)((当前+b)和0xff));
}

你能解释一下未检查的语法吗?@Simon:它将算术置于未检查的上下文中:即使程序集的其余部分使用已检查的算术(即算术溢出时抛出OverflowException),这段代码不会。所以我只是将所有字节相加,如果它溢出,我将得到什么?@Simon:它将忽略任何更高的位-因此255+3将得到2,例如,另一种常见的做法是将字节排他或放在一起。听起来像是一个很弱的校验和。@Jonas Elfström:你能解释一下吗?这不是我的协议,而是我需要与之通信的某个设备协议。但我甚至不明白8位加法是什么:(一个字节为{255,1250}的文件将具有与{10,90,150}或{255,255,252}等相同的校验和。但如果协议是这么说的,那么你对此无能为力。是的,这就是协议的问题:/