为什么Python的struct认为小端和大端意味着长度不同?
我原以为小端和大端的数字在字节大小上是一样的。但Python 2.7的结构模块却说了这样的话:
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
为什么大端的长整型是4个字节,而结构模块却期望小端的长整型是8个字节呢?
2 个回答
3
默认情况下,使用的是@
或本地顺序,这不一定是小端模式。
本地顺序使用本地对齐方式:
默认情况下,C语言的数据类型会以机器的本地格式和字节顺序表示,如果需要的话,会通过跳过填充字节来进行正确对齐(这遵循C编译器的规则)。
(强调是我的)而且
本地字节顺序可以是大端或小端,这取决于主机系统。例如,Intel x86和AMD64(x86-64)是小端模式;而Motorola 68000和PowerPC G5是大端模式;ARM和Intel Itanium则可以切换字节顺序(双端模式)。你可以使用
sys.byteorder
来检查你系统的字节顺序。
导致大小不同的是对齐方式,而不是字节顺序。
C语言数据结构的对齐是为了提高内存性能;你需要确保选择适合你数据输入的正确类型。对于长整型的C语言本地对齐方式是:
一个长整型(八个字节)会进行8字节对齐。
如果不考虑本地对齐方式,想要比较小端和大端,可以在比较时使用<
和>
:
struct.unpack('<L', datalen[4:8])[0]
7
在没有使用 >
或 <
的情况下指定 'L'
并不是“小端模式”;它是本机的字节顺序和本机的大小。标准大小是4个字节,但你机器的本机大小是8个字节。
如果你想要明确使用标准大小的小端模式,可以使用:
struct.unpack('<L', datalen[4:8])[0]