<p>但奇怪的是,如果我们改变元素的顺序,我们会得到不同的结果,例如:</p>
<pre class="lang-py prettyprint-override"><code>In [187]: struct.calcsize('lhh')
Out[187]: 12
In [188]: struct.calcsize('hlh')
Out[188]: 18
In [189]: struct.calcsize('hhl')
Out[189]: 16
</code></pre>
<p>考虑到@Vlad所说的,它不应该都是同样大小的吗</p>
<p>但是,是的,这似乎与性能的一致性有关,并检查此示例:</p>
<pre class="lang-py prettyprint-override"><code>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'
</code></pre>
<p>我们可以看到,通过在短(h)旁边加上long,基本上将短转换为长</p>
<p>但这相当令人困惑,因为理论上,我们应该能够做到以下几点:</p>
<pre class="lang-py prettyprint-override"><code>In [199]: struct.unpack('hlh', b'\x01\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00')
</code></pre>
<p>但实际上我们不能,python抛出了一个错误:</p>
<pre class="lang-py prettyprint-override"><code> -
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
</code></pre>