Как составить список байтов? - PullRequest
1 голос
/ 13 мая 2019

Чтобы упаковать данные для двоичного сетевого протокола, мне нужно преобразовать целое число в список байтов для использования в struct.pack("ccc", myList)

Я обнаружил, что это не работает:
(используя integer.to_bytes)

myData = 0x123456
packed = struct.pack("ccc", *list(myData.to_bytes(3, byteorder='little')))

Исключение составляет char format requires a bytes object of length 1, поскольку список представляет собой список <class 'int'>, даже если он был создан .to_bytes()

Но этот код работает:

myData = 0x123456
packed = struct.pack("ccc", *[bytes([x]) for x in myData.to_bytes(3, byteorder='little')])
# This uses a list-comprehension to convert myData to a list of bytes, instead of a list of integers.

Я пытаюсь понять , почему функция .to_bytes() дала мне список целых чисел, и если есть более Pythonic способчем использование длинного понимания списка для преобразования int в список целых байтов в список байтов.

1 Ответ

2 голосов
/ 14 мая 2019

.to_bytes - это Pythonic способ преобразования в bytes объект. Я думаю, что вам не хватает того, что элементы объекта байтов будут, по определению, однобайтовыми целыми числами

Из документов :

Поскольку bytes объекты являются последовательностями целых чисел (сродни кортежу), для байтового объекта b, b [0] будет целым числом, а b [0: 1] будет байтовым объектом длины 1.

Скорее всего, вы хотите использовать символ формата 'B' (unsigned char). См. Документы по Python здесь

data = 0x123456
packed = struct.pack('BBB', *data.to_bytes(3, 'little'))
...