因为数据包是一个字节数组,也是报文,而校验和是其中之一,校验和是 在数据处理和数据通信领域中,用于校验目的的一组数据项的和,所以算法和很重要:
数据包格式:
**版本号 (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);
}
用其方法代入要获取的数据包与数据包的长度即可获取到。
注:
IP 协议采用统一的校验算法,其计算比较简单:设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。校验时将数据(含校验和)按同样的算法求和,结果为0则数据正确,为其他值表示通讯出错,需要丢弃该数据包

