C# 从数据包获取校验和

因为数据包是一个字节数组,也是报文,而校验和是其中之一,校验和是在数据处理和数据通信领域中,用于校验目的的一组数据项的和,所以算法和很重要:

数据包格式:

**版本号 (2byte)

**Ip地址(4byte)

.......

**校验和 (2byte)

...

方法如下:

/// <summary>
/// 方法:16位无字符整数转字节数组
/// </summary>
/// <param name="i">代入的16为参数</param>
/// <returns></returns>
public static byte[] makeInt16Data(UInt16 m)
{
byte[] bys = BitConverter.GetBytes(m);
Array.Reverse(bys);
return bys;
}

/// <summary>
/// 方法:获取校验
/// </summary>
/// <param name="data">数据包</param>
/// <param name="len">数据包长度</param>
/// <returns></returns>
public static ushort checksum(byte[] data, int len)
{
int sum = 0;
for (int i = 0; i < len; i = i + 2)
{
if (i == 10)
continue;
sum += BitConverter.ToUInt16(makeInt16Data(BitConverter.ToUInt16(data, i)), 0);
}
if (sum > 0xffff)
{
int a = sum >> 16;
sum = (ushort)sum;
sum = sum + a;
}
return (ushort)(~sum);
}

用其方法代入要获取的数据包与数据包的长度即可获取到。


原文地址:https://www.cnblogs.com/Leo_wl/p/2361837.html