さまざまなタイプの一連の値を表す長い16進数の文字列があります。この16進文字列をバイト配列に変換して、各値をシフトアウトして適切なデータ型に変換できるようにします。
16進文字列が次のようなものであるとします
>>> hex_string = "deadbeef"
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
>>> bytes.fromhex(hex_string) # Python ≥ 3
b'\xde\xad\xbe\xef'
>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')
bytes
は、bytearray
の不変バージョンであることに注意してください。
Bytearrayには、意図したことを行う組み込み関数があります。
bytearray.fromhex("de ad be ef 00")
バイト配列を返し、スペース区切り付きまたはなしで16進文字列を読み取ります。
正しく理解できれば、binascii.unhexlifyを探す必要があります。
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
次のようなバイト文字列があると仮定します
"\ x12\x45\x00\xAB"
また、バイト数とそのタイプがわかっているので、このアプローチも使用できます
import struct
bytes = '\x12\x45\x00\xAB'
val = struct.unpack('<BBH', bytes)
#val = (18, 69, 43776)
フォーマット文字列の先頭でリトルエンディアン( '<'文字を使用)を指定したため、関数は同等の10進数を返しました。
0x12 = 18
0x45 = 69
0xAB00 = 43776
Bは1バイト(8ビット)符号なしに等しい
Hは2バイト(16ビット)符号なしに等しい
利点は..
複数のバイトと値のエンディアンを指定できます
欠点..
扱うデータのタイプと長さを本当に知る必要があります
次のようなものを使用して、バイナリデータを保持する文字列を作成できるはずです。
data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
bits += chr(int(data[x:x+2], 16))
これはおそらく最速の方法ではなく(多くの文字列の追加)、コアPythonのみを使用する非常に簡単な方法です。
Python標準ライブラリで Codecsモジュール を使用できます。
import codecs
codecs.decode(hexstring, 'hex_codec')