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);
}
用其方法代入要获取的数据包与数据包的长度即可获取到。
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did49861