struct.calcsize(python)实际计算的是什么?

2024-09-24 20:24:34 发布

您现在位置:Python中文网/ 问答频道 /正文

以下the manual about struct.calcsize

truct.calcsize(fmt)¶

    Return the size of the struct (and hence of the string) corresponding to the given format

但我不明白为什么struct.calcsize('hll')不是struct.calcsize('h')加上struct.calcsize('l')的两倍。见下文。有什么想法吗

In [216]: struct.calcsize('hll')
Out[216]: 24

In [217]: struct.calcsize('h')
Out[217]: 2

In [218]: struct.calcsize('l')
Out[218]: 8

Tags: andoftheinsizereturnoutmanual
2条回答

为了提高效率,我假设这是因为填充了比机器字短的元素

访问机器字长度倍数的内存地址(例如,64位机器的8字节)往往更快。因此,除非另有说明,否则C编译器将填充其结构。struct模块将对互操作性执行相同的操作

不过,它看起来是可配置的,这取决于您计划如何使用它

但奇怪的是,如果我们改变元素的顺序,我们会得到不同的结果,例如:

In [187]: struct.calcsize('lhh')
Out[187]: 12

In [188]: struct.calcsize('hlh')
Out[188]: 18

In [189]: struct.calcsize('hhl')
Out[189]: 16

考虑到@Vlad所说的,它不应该都是同样大小的吗

但是,是的,这似乎与性能的一致性有关,并检查此示例:

In [195]: struct.calcsize('hlh')
Out[195]: 18

In [196]: struct.calcsize('llh')
Out[196]: 18

In [197]: struct.pack('hlh', 1, 2, 3)
Out[197]: b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00'

In [198]: struct.pack('llh', 1, 2, 3)
Out[198]: b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00'

我们可以看到,通过在短(h)旁边加上long,基本上将短转换为长

但这相当令人困惑,因为理论上,我们应该能够做到以下几点:

In [199]: struct.unpack('hlh', b'\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00')

但实际上我们不能,python抛出了一个错误:

                                     -
error                                     Traceback (most recent call last)
<ipython-input-199-41f8bd79fd25> in <module>
  > 1 struct.unpack('hlh', b'\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00')

error: unpack requires a buffer of 18 bytes

相关问题 更多 >