计算UDP校验和的代码如下:
def do_checksum(self, source_string): """ Verify the packet interitity """ sum = 0 max_count = (len(source_string) / 2) * 2 count = 0 while count < max_count: val = ord(source_string[count + 1]) * 256 + ord(source_string[count]) sum = sum + val sum = sum & 0xffffffff count = count + 2 if max_count < len(source_string): sum = sum + ord(source_string[len(source_string) - 1]) sum = sum & 0xffffffff sum = (sum >> 16) + (sum & 0xffff) sum = sum + (sum >> 16) answer = ~sum answer = answer & 0xffff answer = answer >> 8 | (answer << 8 & 0xff00) return answer
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这段代码没有问题。
sum = sum & 0xffffffff 表示只保留sum的低32位数据,32位数据已经可以保证不会有溢出。
UDP报文的长度字段是16位,也就是最长数据为65535字节;
计算校验和时,还包含20字节的报文头(12字节的伪头部+12字节头部),所以最多计算65555字节(65535+20)的校验和;
每个字节都是最大的数据(0xff或者255),那校验和最初计算时的最大值为 65555 * 255 = 16716525 (0xFF12ED),一共才24位,所以不会溢出。