у меня есть некоторые данные байт (скажем, для изображения):Расщепление список байт в список dicts
00 19 01 21 09 0f 01 15 .. FF
я разобрать его и хранить его в виде списка байт:
[b'\x00', b'\x19', b'\x01', b'\x21', b'\x09', b'\x0f', b'\x01', b'\x15', ...]
Эти значения RGBA (прямой порядок байтов, 2 байта), что мне нужно, чтобы разобрать в формате Словаре следующим образом:
[{'red':0x0019, 'green':0x2101, 'blue':0x0f09, 'alpha':0x1501}, {'red':...},...]
Примечание: данные изображения заканчиваются, как только мы достигнем 0xff
. Значения могут храниться в шестнадцатеричном или десятичном значении, не имеет значения, если это согласовано.
Моя попытка:
# our dict keys
keys = ['red', 'green', 'blue', 'alpha']
# first, grab all bytes until we hit 0xff
img = list(takewhile(lambda x: x != b'\xFF', bitstream))
# traverse img 2 bytes at a time and join them
rgba = []
for i,j in zip(img[0::2],img[1::2]):
rgba.append(b''.join([j,i]) # j first since byteorder is 'little'
До сих пор он будет выводить [0x0019, 0x2101, 0x0f09, ...]
Теперь я застрял на том, как создать список dicts "pythonically". Я могу просто использовать цикл for и поп 4 элемента из списка за раз, но на самом деле это не использует возможности Python. Любой совет?
Примечание: это только пример, моими ключами могут быть любые (не связанные с изображениями). Также обратите внимание на любые проблемы с len(img) % len(keys) != 0
.
Просто тангенциальную вопрос: Я собираюсь делать много байт пререкания с Python, и я хочу быть как я могу, любые предложения или библиотеки ресурсов, на которые я должен смотреть? –
Могут быть библиотеки, которые реализуют схему, описанную выше, но вы можете пойти довольно далеко, просто используя то, что находится в стандартной библиотеке. Ключевым моментом здесь является использование двухфакторной формы 'item' для итерации по вашему файлу в кусках фиксированного размера, подходящих для распаковки с помощью' struct', а затем с использованием стандартных методов 'itertools' (или явных для циклов, если вы 't как функциональное программирование :)) для обработки результирующего потока. – chepner