Формат адреса IPv6 из struct.unpack - PullRequest
0 голосов
/ 09 ноября 2018

Какой будет способ распаковать и сопоставить с адресом ipv6. В настоящее время я делаю следующее

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

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

но, конечно, желаемый конечный результат - 2a00 ::, я ожидал, что IPv6Address вернет его, но я что-то упустил.

То, что я сейчас делаю, - это распаковка как sting, затем в hex и добавление ::.

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 голосов
/ 09 ноября 2018

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...