为什么python的struct认为little-endian和big-endian意味着不同的长度?

时间:2014-08-29 14:54:18

标签: python struct byte endianness

我认为little-endian和big-endian数字大小相同(以字节为单位)。但是python 2.7的struct模块说明了这一点:

In [46]: struct.unpack('>L', datalen[4:8])[0]
Out[46]: 35098131

In [47]: struct.unpack('L', datalen[4:8])[0]
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-47-f18e2a303d6c> in <module>()
----> 1 struct.unpack('L', datalen[4:8])[0]

error: unpack requires a string argument of length 8

为什么big endian长4个字节,但struct期望little-endian long为8个字节?

2 个答案:

答案 0 :(得分:6)

在没有'L'>的情况下指定<不是“little-endian”;它的原生字节序原生大小。标准大小为4个字节,但机器的原始大小为8。

如果您明确需要标准尺寸的小端,请使用:

struct.unpack('<L', datalen[4:8])[0]

答案 1 :(得分:3)

默认为@原生顺序,不一定是小端。

原生订单使用原生对齐:

  

默认情况下,C类型以机器的本机格式和字节顺序表示,通过跳过填充字节正确对齐(如果需要)(根据C编译器使用的规则)。

(强调我的)和

  

本机字节顺序是big-endian或little-endian,具体取决于主机系统。例如,Intel x86和AMD64(x86-64)是little-endian;摩托罗拉68000和PowerPC G5都是大端的; ARM和Intel Itanium具有可切换的字节序(双端)。使用sys.byteorder检查系统的字节顺序。

对齐导致大小不同,而不是结束。

C data structure alignment用于提高内存性能;您需要确保为数据输入选择正确的类型。长期的C原生对齐是:

  

长的长(8个字节)将是8字节对齐的。

要在没有原生对齐的情况下比较小和大结束,请在比较时使用<>

struct.unpack('<L', datalen[4:8])[0]