C#实现ICMP校验和算法
//计算ICMP头校验和,需要先把IP数据报的校验位 置为0
public UInt16 GetCheckNum(byte[] value)
{
uint checksum = 0;
int size = value.Length;
int index = 0;
//将每两个字节(16位)相加(二进制求和)直到最后得出结果,若出现最后还剩一个字节继续与前面结果相加
while (size > 1)
{
checksum += Convert.ToUInt32(BitConverter.ToUInt16(value, index));
index += 2;
size -= 2;
}
//判断是否为最后一个字节(判断数组的数据数量是否为奇数), 将最后一个字扩展到双字,继续与前面结果相加
if (size == 1)
{
checksum += Convert.ToUInt32(value[index]);
}
checksum = (checksum >> 16) + (checksum & 0xFFFF);//高16位与低16位相加
checksum += (checksum >> 16);
return (UInt16)(~checksum);//取反然后转换为2字节
}