将十进制(ASCII)数字转换为128位二进制(十六进制)值

时间:2019-07-19 21:18:23

标签: python-3.x

我确定这应该不会那么困难!我正在尝试使用python将一些存储为ASCII值(十进制)的IPv6地址转换为二进制(如果长度不是128位,则扩展为128位),并以小端格式保存到磁盘。

我有各种各样的乐趣(不是)试图使它起作用。

我设法将ASCII值转换为十六进制,然后将值打印到屏幕上,但是,如果我尝试使用类似struct.pack之类的东西,我只会得到类似struct.error:参数的错误范围。

从装配行业的背景出发,我真的很难进行任何类型的转换。

谢谢。

1 个答案:

答案 0 :(得分:2)

使用socket.inet_ptondoc)从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'