我确定这应该不会那么困难!我正在尝试使用python将一些存储为ASCII值(十进制)的IPv6地址转换为二进制(如果长度不是128位,则扩展为128位),并以小端格式保存到磁盘。
我有各种各样的乐趣(不是)试图使它起作用。
我设法将ASCII值转换为十六进制,然后将值打印到屏幕上,但是,如果我尝试使用类似struct.pack之类的东西,我只会得到类似struct.error:参数的错误范围。
从装配行业的背景出发,我真的很难进行任何类型的转换。
谢谢。
答案 0 :(得分:2)
使用socket.inet_pton
(doc)从IPv6字符串中获取128位值:
import socket
packedIP = socket.inet_pton(socket.AF_INET6, '2001:db8::')
print(packedIP)
print('Length =', len(packedIP)*8)
打印:
b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Length = 128
编辑:
import socket
import ipaddress
import struct
ip = int('281470698520832')
# to print IPv6 address
ipv6 = ipaddress.IPv6Address(ip)
print(str(ipv6))
# method 1.
packedIP = socket.inet_pton(socket.AF_INET6, str(ipv6))
print(packedIP)
# method 2.
max_int64 = 0xFFFFFFFFFFFFFFFF
packed = struct.pack('>QQ', (ip >> 64) & max_int64, ip & max_int64)
print(packed)
这将显示IP地址和字节数组:
::ffff:100:100
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x01\x00\x01\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x01\x00\x01\x00'