我认为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个字节?
答案 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]