因为数据包是一个字节数组,也是报文,而校验和是其中之一,校验和是 在数据处理和数据通信领域中,用于校验目的的一组数据项的和,所以算法和很重要:
数据包格式:
**版本号 (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则数据正确,为其他值表示通讯出错,需要丢弃该数据包
      
      
      
    
  


 
					 
					