を操るバイナリデータのPythonの
-
28-09-2019 - |
質問
私は最大のバイナリファイルはこのように:
file = open("test/test.x", 'rb')
読みにラインをリストアップしました。各線ん:
'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
私は困りの時間を操作するようになりました。場合にどのように印刷、pythonの凍結、発beeping騒音(Iがあると思いバイナリービープ音コードがどこか).ただし利用して約このデータは次のようなものですどのように交換することはできま各六角数小数?
解決
印刷するには、このようなことができます。
print repr(data)
ヘックスとしての全体のために:
print data.encode('hex')
各バイトの小数値の場合:
print ' '.join([str(ord(a)) for a in data])
データからバイナリ整数などを解除するには、元々Cスタイルの構造体から来たかのように、 struct モジュール。
他のヒント
\xhh
ヘックス値HHのキャラクターです. 。などの他の文字 .
「〜」は通常の文字です。
文字列を繰り返すと、その中のキャラクターが一度に1つずつ与えられます。
ord(c)
文字を表す整数を返します。 例えば、 ord('A') == 65
.
これにより、各文字の10進数が印刷されます。
s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
print ' '.join(str(ord(c)) for c in s)
言及したTheatrusのように、OrdとHexがあなたを助けるかもしれません。ファイル内の何らかの構造化されたバイナリデータを解釈しようとする場合、 struct モジュールが役立つ場合があります。
バイナリデータが「 n」で区切られた「線」に分割されることはめったにありません。もしそうなら、それはラインターミネーターとして「 n」とデータの一部として「 n」を区別するための暗黙的または明示的なエスケープメカニズムを持っています。エスケープメカニズムの知識なしに盲目的にそのようなファイルを読むことは無意味です。
あなたの具体的な懸念に答えるために:
' x07'はASCII BELキャラクターであり、もともとテレタイプマシンでベルを鳴らすためのものでした。
実行することでバイト「B」の整数値を取得できます ord(b)
.
ただし、バイナリデータを適切に処理するには、レイアウトが何であるかを知る必要があります. 。署名および署名されていない整数(サイズ1、2、4、8バイト)、浮動小数点数、10進数のさまざまな長さの文字列、さまざまな長さの文字列など。ビッグエンディアンのファッションまたはリトルディアンのファッションで。上記のすべてを知ったら(または非常に良い情報に基づいた推測があります)、 Python structモジュール 処理のすべてまたはほとんどに使用できる必要があります。 CTYPESモジュール 有用かもしれません。
データ形式には名前がありますか?もしそうなら、教えてください。コードまたはドキュメントを指摘できる場合があります。
「このデータを安全に使用するにはどうすればよいですか?」と尋ねます。どちらが質問をしますか:あなたはそれを何のために使いたいですか?どんな操作をしたいですか?
ASCII文字に変換されたデータを印刷しようとしていますが、機能しません。
データのバイトを安全に使用できます。 16進数として印刷したい場合は、関数を見てください ord
と hex
/
を使用していま read()
または readline()
?使用 read(n)
読みnバイト readline()
を読み込みまでのヒット改行は、バイナリファイルがございません。
いずれの場合も、返されるバイトの文字列を印字可能-非印刷可能な文字は、どのように変動するという非常に便利です。
何をしたいです ord()
, なしに変更されることがある半角文字列に対応する整数値です。 read()
ファイルからワンバイトと呼 ord()
この結果より、又は繰り返し処理を実行し、全体の文字列になります。
あなたがnumpyを使用することをいとわない場合 ビットストリーム, 、 できるよ
>>> from numpy import *
>>> from bitstream import BitStream
>>> raw = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
>>> stream = BitStream(raw)
>>> stream.read(raw, uint8, len(stream) // 8)
array([190, 0, 200, 100, 248, 100, 8, 228, 46, 7, 126, 3, 158,
7, 190, 3, 222, 7, 254, 10], dtype=uint8)