使用校验和的分组数据?

Packet data using the checksum?

我有数据包,我将其存储为 public static List<byte> packet = new List<byte>();

这个的最后一个字节是校验和,我正在想办法用它来检查数据包数据。

当我有一个完整的数据包时,我 运行:

//get checksum                                    
byte chcksm = packet[packet.Count - 1];
int sum = chcksm;

获取校验和字节的值。

那我运行:

//checksum calculation
public static byte ComputeAdditionChecksum(List<byte> data)
{
    byte sum = 0;
    unchecked // Let overflow occur without exceptions
    {
        foreach (byte b in data)
        {
            sum += b;
        }
    }
    return sum;
}

on packet 获取整个数据包的值,并将其保存在一个名为 packetSum.

的 int 中

比较这两个值,在一个测试数据包上,packetSum,整个数据包的值,returns 76。而校验字节的值returns103.

我做错了吗?

//编辑,在文档中,它说了关于校验和的内容..

1字节校验和表示为:

unsigned char CalcChkSum(unsigned char *MsgBlock,
int Length)
{
    unsigned char Total = 0x40;
    int i;

    for (i = 0; i < Length-1; i++)
    {
        Total -= MsgBlock[i];
    }
    return Total;
}

您似乎在计算中包含了校验和。在没有看到具有预期和实际结果的基础数据的情况下,我会说按如下方式更改循环应该可以解决问题:

public static byte ComputeAdditionChecksum(List<byte> data)
{
    byte sum = 0x40;
    unchecked // Let overflow occur without exceptions
    {
        for (var i = 0; i < data.Count - 1;  i++)
        {
            sum -= data[i];
        }
    }
    return sum;
}