Python 3 Создание массива байтов - PullRequest
33 голосов
/ 26 сентября 2011

Мне нужно построить tcp-фрейм с необработанными двоичными данными, но все примеры и руководства, которые я нашел, говоря о байтах, всегда включают преобразование из строки, и это не то, что мне нужно.

Короче говоря,Мне нужно собрать только массив байтов:

0xA2 0x01 0x02 0x03 0x04

Обратите внимание, что я из мира C / 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) )

Затем сгенерируйте эту переменную кадра для отправки метода сокета, но он не работает должным образом, так как кадр не содержит то, что я хочу ...

Я знаю, что это очень простой вопросо Питоне, так что, если бы вы могли указать мне правильное направление ...

Ответы [ 6 ]

44 голосов
/ 26 сентября 2011

Используйте 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'
13 голосов
/ 26 сентября 2011

а как насчет простого конструирования вашего фрейма из стандартного списка?

frame = bytes([0xA2,0x01,0x02,0x03,0x04])

Конструктор bytes() может построить байтовый фрейм из итерируемого, содержащего int значения.итерируемое - это все, что реализует протокол итератора: список, итератор, итерируемый объект, подобный тому, что возвращается range() ...

6 голосов
/ 26 сентября 2011
frame = b'\xa2\x01\x02\x03\x04'

не упоминалось до сих пор ...

4 голосов
/ 26 сентября 2011
Решение

bytearray от agf работоспособно, но если вам нужно создать более сложные пакеты, используя типы данных, отличные от байтов, вы можете попробовать struct.pack(). http://docs.python.org/release/3.1.3/library/struct.html

0 голосов
/ 05 сентября 2018

Вот решение для получения массива (списка) байтов:

Я обнаружил, что вам нужно сначала преобразовать Int в байт, прежде чем передавать его в байты ():

bytes(int('0xA2', 16).to_bytes(1, "big"))

Затем создайте список из байтов:

list(frame)

Итак, ваш код должен выглядеть так:

frame = b""
frame += bytes(int('0xA2', 16).to_bytes(1, "big"))
frame += bytes(int('0x01', 16).to_bytes(1, "big"))
frame += bytes(int('0x02', 16).to_bytes(1, "big"))
frame += bytes(int('0x03', 16).to_bytes(1, "big"))
frame += bytes(int('0x04', 16).to_bytes(1, "big"))
bytesList = list(frame)

Вопрос был о массиве (списке) байтов. Вы приняли ответ, в котором не указано, как получить список, поэтому я не уверен, действительно ли это то, что вам нужно.

0 голосов
/ 26 сентября 2011

Я думаю, Scapy - это то, что вы ищете.

http://www.secdev.org/projects/scapy/

вы можете создавать и отправлять кадры (пакеты) с ним

...