Python 3 Создание массива байтов
Мне нужно создать tcp-фрейм с необработанными двоичными данными, но все примеры и учебные пособия, которые я нашел о байтах, всегда включают преобразование из строки, и это не то, что мне нужно.
Короче, мне нужно построить только массив байтов:
0xA2 0x01 0x02 0x03 0x04
Обратите внимание, что я пришел из мира C/С++.
Я пробовал это:
frame = b""
frame += bytes( int('0xA2',16) )
frame += bytes( int('0x01',16) )
frame += bytes( int('0x02',16) )
frame += bytes( int('0x03',16) )
frame += bytes( int('0x04',16) )
Затем, переместите эту переменную кадра, чтобы отправить метод сокета, но не работает так, как ожидалось, поскольку фрейм не содержит то, что я хочу...
Я знаю, что это очень простой вопрос о Python, поэтому, если вы можете указать мне в правильном направлении...
Ответы
Ответ 1
Используйте bytearray
:
>>> frame = bytearray()
>>> frame.append(0xA2)
>>> frame.append(0x01)
>>> frame.append(0x02)
>>> frame.append(0x03)
>>> frame.append(0x04)
>>> frame
bytearray(b'\xa2\x01\x02\x03\x04')
или, используя код, но исправляя ошибки:
frame = b""
frame += b'\xA2'
frame += b'\x01'
frame += b'\x02'
frame += b'\x03'
frame += b'\x04'
Ответ 2
как просто создать кадр из стандартного списка?
frame = bytes([0xA2,0x01,0x02,0x03,0x04])
Конструктор bytes()
может построить байтовый кадр из итерабельного, содержащего значения int
. итерабельным является все, что реализует протокол итератора: список, итератор, итерируемый объект, как то, что возвращается range()
...
Ответ 3
frame = b'\xa2\x01\x02\x03\x04'
не упоминалось до сих пор...
Ответ 4
Решение agf bytearray работоспособно, но если вам нужно собрать более сложные пакеты с использованием типов данных, отличных от байтов, вы можете попробовать struct.pack()
. http://docs.python.org/release/3.1.3/library/struct.html
Ответ 5
Я думаю, что Scapy - это то, что вы ищете.
http://www.secdev.org/projects/scapy/
вы можете создавать и отправлять кадры (пакеты) с ним