Python 将 IP 字符串打包为字节



我想实现我自己的struct.pack特定函数,将IP字符串(即"192.168.0.1")打包为32位打包值,而无需使用socket.inet_aton内置方法。

到目前为止,我得到了:

ip = "192.168.0.1"
hex_list = map(hex, map(int, ip.split('.')))
# hex list now is : ['0xc0', '0xa8', '0x0', '0x01']

我的问题是:我如何从那['0xc0', '0xa8', '0x0', '0x01']'xc0xa8x00x01',(这是我从socket.inet_aton(ip)得到的?

还有 - 该字符串中间怎么可能有一个 NUL(x00)?我想我对x格式缺乏一些了解)

您可以使用字符串理解来根据需要进行格式化:

ip = "192.168.0.1"
hex_list = map(int, ip.split('.'))
hex_string = ''.join(['\x%02x' % x for x in hex_list])

或作为单行:

hex_string = ''.join(['\x%02x' % int(x) for x in ip.split('.')])

另一种选择:

你能使用ipaddressto_bytes(python 3.2)吗?

>>> import ipaddress
>>> address = ipaddress.IPv4Address('192.168.0.1')
>>> address_as_int = int(address)
>>> address_as_int.to_bytes(4, byteorder='big')
b'xc0xa8x00x01'

请注意,您实际上可能只需要整数。

显然可以更短,但想清楚地显示所有步骤:)

松散地基于 @Stephen 的答案,但返回一个带有实际字节的字符串,而不是一个带有文字斜杠的字符串:

def pack_ip(ip):
    num_list = map(int, ip.split('.'))
    return bytearray(num_list)
src_ip = pack_ip('127.0.0.255')
print(repr(src_ip))

适用于 Python 2 和 3。返回b''而不是字符串,符合 Python3 的最佳实践。

最新更新