Pythonのstructは主にC構造体のデータを読み込む際に、まずPythonの文字列型に変換されてから、タプルなどのPythonの構造化型に変換されます。一般に、入力チャネルはファイルまたはネットワーク バイナリ ストリームから取得されます。
1.struct.pack() と struct.unpack()
変換プロセス中、フォーマット文字列は主に変換方法と形式を指定するために使用されます。
主なメソッドについて説明します:
1.1 struct.pack(fmt,v1,v2,...)
v1、v2、その他のパラメータの値を1つのレイヤーにパックし、パッケージ化方法を指定しますfmt より。ラップされたパラメータは fmt に厳密に準拠する必要があります。最後に、ラップされた文字列を返します。
1.2 struct.unpack(fmt,string)
名前の通り、解凍します。たとえば、pack はパッケージ化され、unpacked は解凍に使用できます。 データ(文字列)をアンパックしたタプル(タプル)を返します、データが1つしかない場合でもタプルにアンパックされます。このうち、len(string) は calcsize(fmt) と等しくなければなりません。これには calcsize 関数が含まれます。 struct.calcsize(fmt): fmt形式で記述された構造体のサイズを計算するために使用されます。
書式文字列は 1 つ以上の書式文字で構成されます。これらの書式文字の説明については、次の Python マニュアルを参照してください。 x
c | char | ||
---|---|---|---|
b | signed char | integer | |
B | unsignedchar | integer | |
? | _Bool | bool | |
h | short | integer | |
H | unsignedshort | integer | |
i | int | integer | |
I | unsignedint | integerまたはlong | |
l | long | integer | |
L | unsignedlong | long | |
q | longlong | long | |
Q | unsignedlonglong | long | |
f | フロート | フロート | |
d | double | float | |
s | char[] | string | |
p | char[] | string | |
P | void* | 長い | |
2.コード例 | |||
RREEE | VIEWコード最初、パッケージ1,2,3、パッケージングの前に、2,3は明らかに整数に属しますPython データ型は、パッキング後に C 構造のバイナリ文字列になります。Python 文字列型に変換すると、「x01x00x00x00x02x00x03」と表示されます。このマシンはリトル エンディアン (「リトル エンディアン」) であるため、ビッグ エンディアンとリトル エンディアンの違いについてはここを参照してください。そのため、上位ビットは下位アドレス セグメントに配置されます。i は C 構造体の int 型を表します。このマシンは 4 ビットを占有し、1 は 01000000 として表現されます。h は C 構造体の short 型を表し、2 ビットを占有するため、0200 として表現されます。b は、C 構造体の signed char 型を表し、1 ビットを占有します。他の構造体の変換も同様に行われます。一部の特殊なものについては、公式ドキュメントのマニュアルを参照してください。 | Format文字列の先頭には、決定するためのオプションの文字があります。ビッグ エンディアンとリトル エンディアンのリストは次のとおりです。 |
<
リトルエンディアン標準> ;
ビッグエンディアン標準!
標準 |
付加されない場合、デフォルトは@です。マシンの文字順序が使用される場合でも(ビッグエンディアンまたはリトルエンディアン)、C構造体のサイズとメモリ内のアライメントはマシン(ネイティブ)と一致します。整数が 2 ビットのマシンもあれば、4 ビットのマシンもあり、メモリ内で 4 ビットがアライメントされているマシンもあれば、n ビットがアライメントされているマシンもあります (n は不明で、何ビットであるかはわかりません)。 次のように説明されている標準オプションもあります: 標準を使用すると、どのタイプでもメモリ アラインメントが行われません。 たとえば、先ほどのアプレットの後半では、使用されているフォーマット文字列の最初のビットは!これはビッグエンディアン モードの標準アライメントであるため、出力は「x00x00x00x01x00x02x03」となり、上位ビット自体がメモリの上位アドレス ビットに配置されます。 Python の struct.pack() 関数と struct.unpack() 関数の詳細については、PHP 中国語 Web サイトに注目してください。
|
---|