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

时间:2011-11-02 16:17:25

标签: python struct pack

我有一个二进制文件,我正在阅读,其中一些2字节值以'反向'字节顺序存储(小端?),例如。

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

创建这些值的原始程序在内部将它们存储为short。这些值应该对应于: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 个答案:

答案 0 :(得分:9)

字节顺序在格式字符串的开头用单个字符指定。

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

答案 1 :(得分:3)

怎么样

>>> 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。

答案 2 :(得分:1)

我已经使用a.byteswap(True)解决了类似的反向字节顺序问题,但我不确定这是否是最有效的方法。