Распаковать двоичные данные с помощью Python
Я хотел бы распаковать массив двоичных данных в uint16
данные с Python.
Интернет полон примеров использования struct.unpack
но только примеры, имеющие дело с двоичным массивом размером 4.
Большинство из этих примеров следующие (B
это двоичный массив из файла)
U = struct.unpack("HH",B[0:4]);
Поэтому я попытался распаковать массив размером 6:
U = struct.unpack("HHH",B[0:6]);
Оно работает.
Но как это сделать, если я хочу распаковать массив размером L
(L
такое пара)? Я попробовал это:
U = struct.unpack("H"*(L/2),B[0:L]);
но это не работает, суфлер дает мне ошибку (для L=512
например):
struct.error: unpack requires a string argument of length 512
Это сообщение странно, потому что если я хочу распаковать двоичный массив в uint16
Мне нужна строка "HHH...HHH"
половины размера этого массива...
Я был бы очень признателен, если бы кто-нибудь смог мне помочь.
Я немного прогрессирую... На самом деле я пытался:
U = struct.unpack("H"*8,B[0:8]);
Оно работает.
U = struct.unpack("H"*10,B[0:10]);
Оно работает.
U = struct.unpack("H"*222,B[0:444]);
Это все еще работает
U = struct.unpack("H"*223,B[0:446]);
Это не работает! и это никогда не работает для размера больше 446
Надеюсь, это поможет кому-нибудь ответить мне.
@MarkRansom Я проверил len(B), и на самом деле длина составляет 444. Я был настолько уверен, что B - это массив размера 512, потому что B происходит из: B = f.read(512)
где F - это файл размером 8000 байт. Так что проблема с read()... Спасибо за этот ответ! Но если кто-то поможет распаковать двоичный массив размера L, я был бы признателен
3 ответа
Используйте array.fromstring или array.fromfile (см. Http://docs.python.org/2/library/array.html):
import array
U = array.array("H")
U.fromstring(B)
Вариант с переменной длиной одного и того же:
n = 999
U = struct.unpack(str(n)+"H", B)
Если вы хотите распаковать n элементов из двоичных данных, вы указываете количество элементов вместе с типом данных. Для n=999:
U = struct.unpack("999H", B)