算法原理:

假定 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)
View Code

相关文章:

  • 2021-10-16
  • 2021-07-31
  • 2021-10-26
  • 2021-09-22
  • 2022-01-21
  • 2021-06-14
  • 2021-10-29
猜你喜欢
  • 2022-12-23
  • 2021-07-27
  • 2021-06-05
  • 2022-01-06
  • 2021-08-29
  • 2021-10-30
  • 2021-06-11
相关资源
相似解决方案