C#计算TCP IP校验和的简单示例代码(从别处抄的)

从Stackoverflow上找的一个国外的博客

https://cyb3rspy.wordpress.com/2008/03/27/ip-header-checksum-function-in-c/

我自己瞎扯两句,可能有错误

1.字节数要偶数个,校验和的基础是16个比特位一组

2.字节数组太长了可能会计算出错,因为求完和才会将大于16位的高位加到低位

3.求出的结果的字节序跟本机有关,写入根据使用可能要调整为网络字节序

 

算法大体上是,将字节数组按16比特位一组,以网络字节序看待成整数求和,然后把高于16位的位加到低位(原来的高位抹去),直至高于16位的位都是0,然后比特位取反

 

public static ushort ComputeHeaderIpChecksum(byte[] header, int start, int length) {

    ushort word16;
    long sum = 0;
    for (int i = start; i < (length + start); i+=2) {
        word16 = (ushort)(((header[i] << 8 ) & 0xFF00)
        + (header[i + 1] & 0xFF));
        sum += (long)word16;
    }

    while ((sum >> 16) != 0) {
        sum = (sum & 0xFFFF) + (sum >> 16);
    }

    sum = ~sum;

    return (ushort)sum;
 

}

 

posted @ 2021-04-02 10:40  FfD4edyo  阅读(397)  评论(0)    收藏  举报