使用校验和的分组数据?

时间:2016-08-07 08:56:00

标签: c# checksum packet

我有数据包数据,我将其存储为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;
}

packet上获取整个数据包的值,并将其保存在名为packetSum的int中。

比较这两个值,在测试数据包packetSum上,整个数据包的值返回76。校验和字节的值返回103。

我这样做错了吗?

//编辑,在thedocs中,它说明了校验和..

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;
}

1 个答案:

答案 0 :(得分:4)

看起来你在计算中包含了校验和。如果没有看到具有预期和实际结果的基础数据,我会说如下更改循环应解决问题:

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