Python struct.calcsize长度

时间:2014-02-08 04:04:03

标签: python

>>>import struct
>>>size_a = struct.calcsize('10s')
size_a = 10
>>>size_b = struct.calcsize('iii')
size_b = 12
>>>size_c = struct.calcsize('10siii')
size_c = 24

有人可以告诉我为什么size_c是24而不是22(10 + 12)?

1 个答案:

答案 0 :(得分:14)

这与alignment有关。任何特定类型(字节,整数, 等)只能从其标准尺寸的倍数的偏移开始。

  • 字节字符串s可以从任何偏移处开始,因为其标准大小为1.

  • 但是32位整数i只能以4的倍数偏移量开始 (它的大小)。例如,0,4,8,12等

因此,要分析结构10siii,首先要解析10字节字符串。

Offset: 0 1 2 3 4 5 6 7 8 9
        s----------------->

10s占用了预期的前10个字节。现在 以下3个整数。

                            1 1 1 1 1 1 1 1 1 1 2 2 2 2
Offset: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
        s-----------------> x x i-----> i-----> i----->

每个整数跨越4个字节,但每个整数只能以a的偏移量开始 4的倍数(即8,12,16,20,而不是10)。由于起始字节串占用10个字节,因此必须如此 填充2个字节以允许整数处于适当的偏移量。因此,您最终得到的结构总大小包括:10(开始字节字符串)+ 2(填充)+ 12(3个整数)= 24字节结构。