如何切换二进制数据的字节顺序

8 投票
3 回答
15846 浏览
提问于 2025-04-17 05:30

我有一个二进制文件,里面存储了一些以“反向”字节顺序(小端格式?)存储的2字节值,比如:

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

创建这些值的原始程序内部是把它们存储为短整型(shorts)。这些值应该对应于: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

在查看了struct的文档后,我以为我可以使用类似于

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

但在测试时,我只得到了

struct.error: bad char in struct format

我该如何以正确的字节顺序解包这些值?我是不是只能分别读取这两个字节,然后在Python代码中重新组合它们?

3 个回答

1

我之前遇到过一个类似的问题,就是字节顺序反转。我是通过使用 a.byteswap(True) 这个方法来解决的,不过我不太确定这是不是最有效的办法。

4

怎么样呢

>>> 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的文档,似乎需要使用<来指定小端字节序。

10

字节顺序是用一个字符来表示的,这个字符放在格式字符串的开头。

values = struct.unpack('!7h', data)

撰写回答