2017-07-13 81 views
6

我試圖使用struct.pack功能結構包返回太長

import struct 
values = (0, 44) 
s = struct.Struct('HI') 
b = s.pack(*values) 
print(b) 
print(str(len(b))) 

,這讓我這個輸出:

b'\x00\x00\x00\x00,\x00\x00\x00' 
8 

python docs說:

Format - C Type   - Python type - Standard size - Notes 

H  - unsigned short - integer  - 2    - (3) 

I  - unsigned int - integer  - 4    - (3) 

so len()應該是2 + 4 = 6,並且我需要size = 6的字節

任何想法?

我使用Python 3.6在Windows 10

回答

4

pack將添加填充字節,使得第二整數4字節對齊。 From the documentation

默認情況下,打包給定C結構的結果包含填充字節,以便保持所涉及的C類型的正確對齊;要...省略隱含填充字節,使用標準尺寸和對齊,而不是本機的大小和排列:見Byte Order, Size, and Alignment的細節

+3

這讓我一個答案,應使用'struct.Struct( '= HI')','結構.Struct(' HI')', – Dela

1

大小計算不直接添加劑爲包含原生類型。您應該計算使用struct.calcsize大小:

In [8]: struct.calcsize('HI') 
Out[8]: 8 
3

這就是"Data structure padding"的結果。它將填充H(2字節+ 2字節填充),以便它與I(4字節)對齊。

但是,如果您需要減小尺寸,則可以嘗試使用該順序。引述維基百科:

它可以改變結構的排列,以減少所需的內存重新排序結構成員或改變編譯器的對齊(或「包裝」)的(或符合現有格式)結構成員。

例如我的電腦上它的作品,如果你只是交換HI

import struct 
values = (0, 1) 
s = struct.Struct('IH')   # swapped H and I 
b = s.pack(*values) 
print(b)      # b'\x00\x00\x00\x00\x01\x00' 
print(str(len(b)))    # 6 
print(struct.calcsize('IH')) # 6 
print(struct.calcsize('HI')) # 8