解压缩并映射到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::'
答案 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地址表示。