未加工のバイト エンコードされた IPv6 アドレスをipaddr-py プロジェクトの IPv6Address オブジェクトに変換する必要がよくあります。次に示すように、バイト エンコードされた IPv6 アドレスは初期化子によって受け入れられません。
>>> import ipaddr
>>> byte_ip = b'\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
>>> ipaddr.IPAddress(byte_ip)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ipaddr.py", line 78, in IPAddress
address)
ValueError: ' \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' does
not appear to be an IPv4 or IPv6 address
バイトエンコーディングを ipaddr-py が理解できる形式に変換する最も簡単な方法は何ですか? ipaddr.py の v. 2.1.10 を使用しています。
これまでの私の唯一の回避策は、単純なタスクには長すぎることです。
>>> def bytes_to_ipaddr_string(c):
... c = c.encode('hex')
... if len(c) is not 32: raise Exception('invalid IPv6 address')
... s = ''
... while c is not '':
... s = s + ':'
... s = s + c[:4]
... c = c[4:]
... return s[1:]
...
>>> ipaddr.IPAddress(bytes_to_ipaddr_string(byte_ip))
IPv6Address('2000::1')
編集:クロスプラットフォーム ソリューションを探しています。Unix のみではできません。
誰もがより良い解決策を得ましたか?