Python socket错误:Ntohl()
我在一些主机上遇到了socket.ntohl()
函数的问题。在所有类似的主机上,这个问题都是可以重复出现的;这些主机都是32位的,使用的是Python 2.4.2。
>>> socket.ntohl(16777215)
-256
不过,反向操作似乎没有问题 -
>>> socket.htonl(4294967040)
16777215
我查看了文档,里面没有提到任何限制或警告。这是这个旧包在Novell版本中的一个bug吗?它们都是Suse 9的机器 :(
1 个回答
3
在以前的32位Python版本中,int
类型只能表示一个有符号的32位数字。比如16777215在十六进制中表示为0x00FFFFFF,而-256在32位的补码表示法中是0xFFFFFF00。
在Python 2.7中,通过将这个值升级为长整型(long),它就能正常工作了:
>>> socket.ntohl(16777215)
4294967040L
>>> hex(4294967040)
'0xffffff00L'
编辑:
Python 2.4是第一个将int
和long
合并的版本,所以你看到的这个情况可以算是一个bug,而在2.7中已经修复了。
看起来这个问题已经解决了。