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