Учитывая объект bytearray длиной 2xN, как я могу получить список (или массив) из N 16-битных целых чисел из этого объекта?

Например, если ba определяется как:

ba = bytearray([0x01, 0x02, 0x01, 0x03, 0xff, 0xff])

Тогда после преобразования результат будет примерно таким:

ia = [0x0102, 0x0103, 0xffff]
print(ia[1]) ==> 0x0103
0
ysap 11 Окт 2021 в 19:37

2 ответа

Лучший ответ

Вы можете использовать int.from_bytes и небольшой список. Обратите внимание, что необходимо указать byte_order, поэтому вам, возможно, придется изменить это в зависимости от вашего приложения.

ba = bytearray([0x01, 0x02, 0x01, 0x03, 0xff, 0xff])
ia = [int.from_bytes(ba[i:i+2], "big") for i in range(0, len(ba), 2)]
2
BTables 11 Окт 2021 в 16:45

Это похоже на кодировку с прямым порядком байтов (первый байт - это старшие биты). Вы можете использовать пакет struct. Он использует строку формата для описания байтов, поступающих из некоторого итеративного объекта.

import struct
unpacker = struct.Struct(">H")
ba = bytearray([0x01, 0x02, 0x01, 0x03, 0xff, 0xff])
result =  [unpacked[0] for unpacked in unpacker.iter_unpack(ba)]
print([hex(r) for r in result])
2
tdelaney 11 Окт 2021 в 16:48