Как изменить порядок байтов двоичных данных - PullRequest
8 голосов
/ 02 ноября 2011

У меня есть двоичный файл, который я читаю, где некоторые 2-байтовые значения хранятся в «обратном» порядке байтов (little-endian?), Например.

1D 00 13 00 27  00 3B 00 45  00 31 00 4F

Исходная программа, которая создала эти значенияхранит их внутри как шорты.Эти значения должны соответствовать: 29, 19, 39, 59, 69, 49, 79. Я пытаюсь прочитать эти значения, используя python 2.6.5 (хотя это, вероятно, будет работать на гораздо более старых системах, например, 2.3 и 2.4)..

Я пытался использовать

val1, val2, val3, val4, val5, val6, val7 = struct.unpack("1h 1h 1h 1h 1h 1h 1h", data)

и, конечно, все значения неверны:

7427
4864
9984
15104
17664
12544
20224

После просмотра документации для структуры,Я думал, что смогу использовать что-то вроде

val1, ... = struct.unpack("!h !h ...

, но при тестировании я получил только

struct.error: bad char in struct format

Как мне распаковать эти значения с правильным порядком байтов?Я застрял, читая два байта отдельно, а затем снова собирал их в коде Python?

Ответы [ 3 ]

9 голосов
/ 02 ноября 2011

Порядок байтов указывается одним символом в начале строки формата.

values = struct.unpack('!7h', data)
3 голосов
/ 02 ноября 2011

Как насчет

>>> a='\x1d\x00\x13\x00\x27\x00\x3b\x00\x45\x00\x31\x00\x4f\x00'

>>> struct.unpack('<%dH' % (len(a) / 2), a)

(29, 19, 39, 59, 69, 49, 79)

Согласно документации struct похоже, что вам нужно использовать < для указания little-endian.

1 голос
/ 14 декабря 2012

Я решил аналогичную проблему обратного порядка байтов с помощью a.byteswap(True), но я не уверен, является ли это наиболее эффективным методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...