算法原理:
假定 output[2] 为输出结果,input[n]为待计算校验和的内存块。
1)所有奇数位[0,2,4……] byte 累加进 结果的奇数位内存 output[0],如果溢出,则进位给偶数位的 output[1];
2)所有偶数位[1,3,5……] byte 累加进 结果的偶数位内存 output[1],如果溢出,则进位给奇数位的 output[0];
3)最后对 output[2] 求反码即可
示例代码
#!/usr/bin/env python # -*- coding: utf-8 -*- import struct import sys def ip_cksum(s): a = 0 b = 0 # 偶数序号的 unsigned char 互相累加 for i in xrange(0, len(s), 2): a += struct.unpack('B', s[i])[0] # 奇数序号的 unsigned char 互相累加 for i in xrange(1, len(s), 2): b += struct.unpack('B', s[i])[0] # 缩小值为 unsigned char while a > 256 or b > 256: b += a/256 # a 超过 byte 的部分进位给 b a = a%256 a += b/256 # b 超过 byte 的部分进位给 a b = b%256 # 取反 a = ~a & 0xff b = ~b & 0xff # 校验和作为字符串 v = chr(a) + chr(b) # 校验和作为 unsigned short v = struct.unpack('H', v)[0] return v if __name__ == '__main__': for i in sys.argv[1:]: print ip_cksum(i)