2017-07-13 9 views
6

長すぎる私はstruct.pack機能に構造体パックリターンが

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

を使用しようとしている、それが私にこの出力できます:python docsが言うながら

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

を:

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

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

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

だからlen()は2 + 4 = 6でなければならず、サイズ= 6のバイトが必要です

アイデアはありますか?

私が直接含まれているネイティブ型用の添加されていないWindowsの10

答えて

4

packはパッドバイトを追加します。 the documentation

既定では、指定されたC構造体をパックした結果、関係するC型の適切な配置を維持するためのパッドバイトが含まれます。 ...暗黙のパッドバイトを省略し、代わりにネイティブサイズとアライメントの標準サイズとアライメントを使用します。"Data structure padding"の結果です詳細

+3

私に答えを得た、 '' struct.Struct( '= HI')を使用する必要があり、 '構造体.Struct( ' HI') '、 – Dela

1

上のサイズ計算をPythonの3.6を使用しています。あなたはstruct.calcsizeを使用してサイズを計算する必要があります2番目の整数は4バイトが整列されるように

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

ためByte Order, Size, and Alignmentを参照してください。 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