结构打包错误:整数超出'L'格式码范围

0 投票
1 回答
3073 浏览
提问于 2025-04-18 01:50

我正在尝试把 int 数据转换成 IP 地址,包括 IPv6 和 IPv4。

def int2ip(i):
    if i > sys.maxint * 2 - 1: # ipv6
        socket.inet_ntop(socket.AF_INET6, struct.pack('!L', i))
    socket.inet_ntop(socket.AF_INET, struct.pack('!I', i)) # ipv4

但是对于一个 IPv6 地址 240e:800::,它的整数表示是 47925062263553288224699872696711774208,但是当我把这个整数值传给 int2ip 时,出现了以下错误:

struct.error: integer out of range for 'L' format code

其实这个整数值实际上是 long 类型的:

>>> print(type(47925062263553288224699872696711774208)
<type 'long'>

这是为什么呢?

1 个回答

0

你正在尝试把一个128位的数字放进一个32位的地方('L'格式代码)。

Python 3有一个库可以用来管理IP地址(IPv4和IPv6):https://docs.python.org/3/library/ipaddress.html。对于Python 2,有一个可以使用的旧版本:https://pypi.python.org/pypi/ipaddress

撰写回答