Строка IP пакета Python
Я хочу реализовать свое собственное 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']
в '\xc0\xa8\x00\x01'
, (это то, что я получаю от socket.inet_aton(ip)
?
(А также - как это возможно, что есть NUL (\x00
) в середине этой строки? Я думаю, что мне не хватает понимания \x
формат)
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('.')])
Альтернатива:
Вы можете использовать ipaddress
а также to_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'\xc0\xa8\x00\x01'
Обратите внимание, что вам может понадобиться только целое число.
Можно короче очевидно, но хотелось четко показать все шаги:)
На основании свободного ответа @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.