2014-08-29 111 views
1

我认为little-endian和big-endian数字是相同的大小(以字节为单位)。但是Python 2.7的结构模块,这样说:为什么python的struct认为little-endian和big-endian意味着不同的长度?

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个字节?

+1

尝试'struct.unpack(“ sebastian 2014-08-29 14:56:30

回答

5

指定'L'没有><是不是“小尾数”;它的本地大小为。标准尺寸为4个字节,但你的机器的本身尺寸为8

如果要明确标准尺寸小端,使用:

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

+ 1哇,我想知道有多少人已经(或有一天会被..)刺痛。 FWIW,因为你让我阅读文档,''= L''是标准大小/本地端。机器体系结构固有的“本地大小”还是由c编译器决定的? – agentp 2014-08-29 15:51:05

+0

@george:取决于您的机器架构,因为完成对齐以最大化内存吞吐量。请参阅'struct'模块文档(在我的答案中引用)和[Wikipedia](http://en.wikipedia.org/wiki/Data_structure_alignment)。 – 2014-09-09 18:46:06

3

默认值是@原生顺序,这不一定是小尾数。

天然顺序使用本机对准:

在默认情况下,C类型在本机的本机格式和字节顺序表示,并且适当地如果需要(根据由所使用的规则跳过填充字节对准C编译器)。

(重点煤矿)和

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

这是对齐,导致大小不同,而不是endianess。

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

一长串(八个字节)将是8字节对齐。

为没有本机对准小和大字节序之间的比较,使用<>比较时:

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