長い16進文字列からPythonバイトオブジェクトを作成するにはどうすればよいですか?


89

文字列に16進数の長いシーケンスがあります。

000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44

はるかに長く、数キロバイトです。Python 2.6 / 3でこれをbytesオブジェクトに変換する組み込みの方法はありますか?


4
以下の回答は似ているように見えるかもしれませんが、異なるタイプの値を返すことに注意してください。s.decode( 'hex')は、unhexlify(s)と同様に、strを返します。bytearray.fromhex(s)はbytearrayを返します。この質問の文言を考えると、大きな緑色のチェックマークは、s.decode( 'hex')ではなくbytearray.fromhex(s)にあるべきだと思います。
ポールホフマン


2
2年後に作成された質問の複製になるにはどうすればよいですか?
再帰的

1
@CiroSantilli郝海东冠事病六四事件法轮功バイト文字列はバイト配列ではありません。stackoverflow.com/questions/1740696/...
LarsH

@LarsHは十分に公平です。@再帰:日付が主な要因ではありません。meta.stackexchange.com/questions/147643/...
チロSantilli郝海东冠状病六四事件法轮功

回答:


95

python3を含むPython2.7以降で動作します。

result = bytearray.fromhex('deadbeef')

注: Python2.6のbytearray.fromhex()関数にはバグがあるようです。python.orgのドキュメントには、関数は引数として文字列を受け入れると記載されていますが、適用すると、次のエラーがスローされます。

>>> bytearray.fromhex('B9 01EF')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fromhex() argument 1 must be unicode, not str`

9
そしてもう1つのステップとして、バイト文字列(Python3のb '\ x04 \ xea [...]'など)が必要でした。これは、バイト配列から取得できますbytes(bytearray.fromhex('deadbeef'))
berto

5
@berto:その場合、の形式でより直接的なルートがありbinascii.unhexlify()ます。
MartijnPieters

1
おかげで、@ MartijnPieters、私はそのショットを与えます
berto 2016年

1
この答えは、質問が尋ねたことをしません。Pythonのバイト文字列ではなく、可変のバイト配列を返します。これは、文字列ではなく文字列の配列を返すようなものです。
マイクマーティン

1
@LarsH:そのメソッドは古いPython2リリースでは使用できません。それは今日はもう問題ではありませんが、2016
。– MartijnPieters

73
result = bytes.fromhex(some_hex_string)

2
これは、元の投稿が求めていることを行うための最も直接的な方法のようです。これが受け入れられた答えではない理由はありますか?
セバスチャンガウェダ

fromhex()メソッド(bytesとbytearrayの両方)は、16進数がスペースで区切られている場合にも機能します。とても便利!
klaws

1
これは本当に受け入れられた答えでなければなりません。現在受け入れられている回答は、質問が尋ねたものを実行しません。バイト文字列ではなく、バイトの可変配列を返します。
マイクマーティン

40

これは、16進コーデックを使用して実行できます。すなわち:

>>> s='000000000000484240FA063DE5D0B744ADBED63A81FAEA390000C8428640A43D5005BD44'
>>> s.decode('hex')
'\x00\x00\x00\x00\x00\x00HB@\xfa\x06=\xe5\xd0\xb7D\xad\xbe\xd6:\x81\xfa\xea9\x00\x00\xc8B\x86@\xa4=P\x05\xbdD'

16
codecs.decode('0a0a0a', 'hex_codec')2.xおよび3.xで動作するはずです:
Abbafei 2014年

37

binasciiモジュールを試してください

from binascii import unhexlify
b = unhexlify(myhexstr)

9
2.xでそれを行う2つの方法、3.xで3つの方法。そんなに...「それを行うための唯一の方法があります」のために
technomalogical

他の2つの方法はもっと「組み込み」なので、実際にはそのうちの1つを使用します。
クレセントフレッシュ

@technomalogical:あなたのコメントは答えとは無関係です。おそらくそれを削除して、comp.lang.pythonへの投稿に変更する必要があります。
tzot 2009年

1
@technomalogical:私はΤΖΩΤΖΙΟΥに同意します。また、あなたはそれを間違えました。正しい言い回しは次のとおりです。それを行うための明白な方法は1つ、できれば1つだけでなければなりません。
nosklo 2009年

2
Python 3.2では(設計によるものかバグかはわかりませんが)unhexlify、文字列を受け入れず、バイトのみを受け入れるようになったことに注意してください。本当にばかげていますが、それはあなたが使用する必要があることを意味しますb = unhexlify(bytes(myhexstr, 'utf-8'))
スコットグリフィス

2
import binascii

binascii.a2b_hex(hex_string)

それが私がやった方法です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.