web-dev-qa-db-ja.com

ASCII文字列をバイナリとしてpython

ASCII string = "abcdefghijk"があります。これを、Pythonを使用してバイナリ形式でバイナリファイルに書き込みたいと思います。

私は以下を試しました:

str  = "abcdefghijk"
fp = file("test.bin", "wb")
hexStr = "".join( (("\\x%s") % (x.encode("hex"))) for x in str)
fp.write(hexStr)
fp.close()

ただし、test.binを開くと、バイナリではなくASCII形式で次のように表示されます。

\x61\x62\x63\x64\x65\x66\x67

ここに2つのスラッシュ( "\\ x%s")があるので、私はそれを理解しています。この問題を解決するにはどうすればよいですか?前もって感謝します。

更新:

以下は私に期待される結果を与えます:

file = open("test.bin", "wb")
file.write("\x61\x62\x63\x64\x65\x66\x67")
file.close() 

しかし、「abcdef」ASCII文字列でこれを実現するにはどうすればよいですか?

8
aMa

\xhhがPython文字列で何をするかを誤解しました。Python文字列で\x表記を使用すると構文のみ =特定のコードポイントを生成します。

'\x61'を使用して文字列を生成するか、'a'を使用できます。どちらも2つの言い方です16進値61の文字を含む文字列を教えてください。例:a ASCII character

>>> '\x61'
'a'
>>> 'a'
'a'
>>> 'a' == '\x61'
True

したがって、\xhh構文は値ではありません;最終結果には、\x、および61の文字はありません。

あなたはあなたの文字列を書くだけです

somestring = 'abcd'

with open("test.bin", "wb") as file:
    file.write(somestring)

バイナリファイルには魔法のようなものは何もありません。テキストモードで開かれたファイルとの唯一の違いは、バイナリファイルが\n改行をプラットフォームの行区切り文字標準に自動的に変換しないことです。例えばWindowsでは、\nを書き込むと代わりに\r\nが生成されます。

バイナリデータを書き込むために16進エスケープを生成する必要はありません。

On Python 3文字列はUnicodeデータであり、エンコードせずにファイルに書き込むことはできませんが、On Python strタイプは- すでにエンコードされたバイト。したがって、Python 3を使用します:

somestring = 'abcd'

with open("test.bin", "wb") as file:
    file.write(somestring.encode('ascii'))

または、バイト文字列リテラルを使用します。 b'abcd'

13
Martijn Pieters

私はあなたがバイナリ/ ASCIIが何であるかを必ずしも理解していないと思います...すべてのファイルはそのほんの少しという意味でバイナリです。 asciiはいくつかのビットの単なる表現です... 99.9999%のファイルエディタは、可能であれば、そしてファイル自体に宣言された他のエンコーディングがない場合、あなたのビットをasciiとして表示します...

fp.write("abcd") 

正確に同等から

fp.write("\x61\x62\x63\x64")
2
Joran Beasley