一般に、Python 自体はバイナリをサポートしていませんが、それを補うモジュール、つまり struct モジュールが提供されています。
Python にはバイナリ型はありませんが、バイナリ型のデータを格納できます。つまり、文字列は 1 バイトに基づいているため、バイナリ型のデータを格納するのにこれは問題ではありません。
import struct
a=12.34
#aをバイナリに変換
bytes=struct.pack('i',a)
このとき、bytesは文字列stringであり、文字列はaと同じです。バイナリストレージの内容は同じです。
次に、逆の操作を実行します
既存のバイナリ データ バイト (実際には文字列) を Python データ型に変換します:
a,=struct.unpack('i',bytes)
注、 unpackタプルを返します
つまり、変数が 1 つだけの場合:
bytes=struct.pack('i',a)
次に、デコード時にこれを行う必要があります
a,=struct.unpack('i' ,bytes) または (a,)=struct.unpack('i',bytes)
a=struct.unpack('i',bytes) を直接使用する場合、a=(12.34,) は代わりにタプルになります。元の浮動小数点数は失われます。
複数のデータで構成されている場合は、次のようになります。
a='hello' b='world!' c=2 d=45.123 bytes=struct.pack('5s6sif',a,b,c,d)
このときのバイトはバイナリ形式のデータであり、binfile.write(bytes) のようにファイルに直接書き込むことができます。
その後、必要に応じて bytes=binfile.read() で読み出すことができます
そして、struct.unpack() を通じて Python 変数にデコードします
a,b,c,d=struct.unpack( '5s6sif',bytes)
' 5s6sif' は fmt と呼ばれ、数字と文字で構成される書式設定された文字列です。5s は 5 文字の文字列、2i は 2 つの整数などを意味します。使用可能な文字と型は次のとおりです。 . ctype は Python で使用できることを意味します。 の型は 1 対 1 に対応します。
フォーマット | Cタイプ | Python | バイト数 |
---|---|---|---|
x | パッドバイト | 値なし | 1 |
c | char | string長さ1 | 1 |
b | signed char | integer | 1 |
B | unsigned char | integer | 1 |
? | _ブール | ブール | 1 |
h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | 整数 | 4 |
I | unsigned int | integer または long | 4 |
l | long | integer | 4 |
L | unsigned long | long | 4 |
q | 長い長い | long | 8 |
Q | unsignedlonglong | long | 8 |
f | float | float | 4 |
d | ダブル | フロート | 8 |
s | char[] | string | 1 |
p | char[] | string | 1 |
P | void * | long |
最後のものは、4 バイトを占有するポインター型を表すために使用できます
C の構造体とデータを交換するには、一部の C または C++ コンパイラーがバイト アライメント (通常は 32 ビットの場合は 4 バイト) を使用することも考慮する必要があります。ユニットのシステムに加え、
文字 | バイトオーダー | サイズと配置 |
---|---|---|
@ | native | native 4 バイトで十分です |
= | ネイティブ | 標準元のバイト数による |
< | リトルエンディアン | 標準エンディアン |
! | ネットワーク (= ビッグエンディアン) | |
使用方法は、'@5s6sif'のようにfmtの先頭に置くことです -----バイナリファイルの処理時に遭遇した問題----- バイナリファイルの処理時に使用します、次のメソッドを使用する必要があります binfile=open(filepath,'rb') を使用してバイナリファイルを読み取る 、または binfile=open(filepath,'wb') を使用してバイナリファイルを書き込む必要があります binfile=open(filepath,'r ') と同じ 結果の違いは何ですか? 2 つの違いがあります: まず、「r」を使用するときに「0x1A」に遭遇すると、それはファイルの終わり、つまり EOF とみなされます。 「rb」を使用すると、この問題は発生しません。つまり、バイナリで書き込み、テキストで読み出す場合、「0X1A」が存在するとファイルの一部だけが読み出されます。 「rb」を使用すると、ファイルの最後まで読み取られます。 2 番目に、文字列 x='abc/ndef' の場合、len(x) を使用して長さを 7 にできます。/n は改行文字と呼ばれ、実際には '0X0A' です。テキスト モードで「w」を使用して書き込むと、「0X0A」は Windows プラットフォーム上で 2 つの文字「0X0D」と「0X0A」に自動的に変更されます。つまり、ファイルの長さは実際には 8 になります。 「r」テキスト モードで読み取ると、元の改行文字に自動的に変換されます。書き込み時に「wb」バイナリモードに変更すると、1文字は変更されず、読み取り時にそのまま読み込まれます。したがって、テキスト モードで書き込み、バイナリ モードで読み取る場合は、この余分なバイトを考慮する必要があります。 「0X0D」は復帰文字とも呼ばれます。 Python を使用してバイナリ ファイルを読み書きするための上記の簡単な方法 (推奨) は、エディターによって共有されるすべての内容です。参考にしていただければ幸いです。また、PHP 中国語 Web サイトをサポートしていただければ幸いです。 Python を使用してバイナリ ファイルを読み書きする簡単な方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。 |