为什么Python的struct认为小端和大端意味着长度不同?

1 投票
2 回答
2265 浏览
提问于 2025-04-18 20:35

我原以为小端和大端的数字在字节大小上是一样的。但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]

撰写回答