Python实现UDP校验计算的一个问题
高洛峰
高洛峰 2016-10-25 09:22:11
[Python讨论组]

计算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


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
三叔

这段代码没有问题。
sum = sum & 0xffffffff 表示只保留sum的低32位数据,32位数据已经可以保证不会有溢出。
UDP报文的长度字段是16位,也就是最长数据为65535字节;
计算校验和时,还包含20字节的报文头(12字节的伪头部+12字节头部),所以最多计算65555字节(65535+20)的校验和;
每个字节都是最大的数据(0xff或者255),那校验和最初计算时的最大值为 65555 * 255 = ‭16716525‬ (0xFF12ED),一共才24位,所以不会溢出。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号