代入的16为参数///pu" />

C# 从数据包获取校验和

系统 1836 0

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

数据包格式:

**版本号 (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则数据正确,为其他值表示通讯出错,需要丢弃该数据包

C# 从数据包获取校验和


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论