struct.unpack

时间:2018-11-09 19:44:37

标签: python struct

解压缩并映射到ipv6地址的方式是什么。我目前正在执行以下

In [3]: struct.unpack("!h",'*\x00')
Out[3]: (10752,)

In [5]: ipaddress.IPv6Address(10752)
Out[5]: IPv6Address(u'::2a00')

但是,当然,我希望的最终结果是2a00 ::,我期望IPv6Address返回它,但是我丢失了一些东西。

我当前正在做的事情是先将其解压缩,然后将其放入十六进制并附加::。

In [14]: struct.unpack("!2s",'*\x00')
Out[14]: ('*\x00',)

In [15]: '*\x00'.encode("hex")
Out[15]: '2a00'

then append to hex and append 

In [16]: '*\x00'.encode("hex")+'::'
Out[16]: '2a00::'

1 个答案:

答案 0 :(得分:2)

IP地址将我们可以看到的二进制数转换为带有十六进制数的128位表示形式(以及其他一些用于压缩零序列的逻辑)。

数字10752等效于:

00        00        00        00        00        00        00  (hex)
00        00        00        00        00        2a        00

00000000  00000000  00000000  00000000  00000000  00000000  00000000  (bin)
00000000  00000000  00000000  00000000  00000000  00101010  00000000

或因此之间有冒号:

0000:0000:0000:0000:0000:0000:0000:2a00

这实际上就是您得到的。 IPv6地址使用双冒号分隔零个序列。

如果我们将值移位但放112(128-16),则得到:

2a        00        00        00        00        00        00  (hex)
00        00        00        00        00        00        00

00101010  00000000  00000000  00000000  00000000  00000000  00000000  (bin)
00000000  00000000  00000000  00000000  00000000  00000000  00000000

因此是:

2a00:0000:0000:0000:0000:0000:0000:0000

因此我们可以通过以下方式获得所需的输出:

>>> ipaddress.IPv6Address(10752<<112)
IPv6Address('2a00::')

请注意,上述操作仅在数据小于 2 16 = 65'536 时有效,因为否则它将占用16位以上,然后值太大,无法用IPv6地址表示。