Строка 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.

Другие вопросы по тегам