Python将IP字符串打包为字节

Python将IP字符串打包为字节,python,ip-address,pack,unpack,inet-aton,Python,Ip Address,Pack,Unpack,Inet Aton,我想实现我自己的struct.pack特定函数,将IP字符串(即“192.168.0.1”)打包为32位压缩值,而不使用socket.inet\u 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']到'\x

我想实现我自己的
struct.pack
特定函数,将IP字符串(即“192.168.0.1”)打包为32位压缩值,而不使用
socket.inet\u 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']
'\xc0\xa8\x00\x01'
,这就是我从
socket.inet\u aton(ip)
得到的

(<强>也<>强> -怎么可能有一个NUL(<代码> \x00 < /代码>)在该字符串的中间?我想我对“代码> \x格式没有理解”< /P> < P>一个备选方案:

您能使用and(python 3.2)吗

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


可以明显缩短,但希望清楚地显示所有步骤:)

您可以使用字符串理解来设置格式:

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('.')])

大致基于@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))

适用于Python2和Python3。返回一个
b'
而不是一个字符串,与Python3的最佳实践相匹配。

我尝试过,但得到的“\\xc0\\xa8\\x00\\x01”不等于“\xc0\xa8\x00\x01”。它是一样的吗?
\
只是Python向您展示单个
\
的方式。请将
'\\x%02x'
更改为
r'\x%02x'
,并注意您得到的结果是相同的。我知道,但我发送此地址时会是相同的吗?它是否与socket.inet\u aton接收到的值相同?转义字符串有点像黑色艺术。答案是:视情况而定。在这个过程中的每一步都有可能有人解释字符串,因此需要某种形式的转义。我只是简单地回答了你关于如何获得指定字符串的问题。谢谢你的回答!谢谢你的回答!
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))