web-dev-qa-db-ja.com

pythonのバイト配列への16進文字列

さまざまなタイプの一連の値を表す長い16進数の文字列があります。この16進文字列をバイト配列に変換して、各値をシフトアウトして適切なデータ型に変換できるようにします。

120
Richard

16進文字列が次のようなものであるとします

>>> hex_string = "deadbeef"

文字列に変換します(Python≤2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"

またはPython 2.7およびPython 3.0以降:

>>> bytes.fromhex(hex_string)  # Python ≥ 3
b'\xde\xad\xbe\xef'

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

bytesは、bytearrayの不変バージョンであることに注意してください。

185
tzot

Bytearrayには、意図したことを行う組み込み関数があります。

bytearray.fromhex("de ad be ef 00")

バイト配列を返し、スペース区切り付きまたはなしで16進文字列を読み取ります。

132
kugg

正しく理解できれば、binascii.unhexlifyを探す必要があります。

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
14
Bruce

次のようなバイト文字列があると仮定します

"\ 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ビット)符号なしに等しい

利用可能な文字とバイトサイズの詳細はこちら

利点は..

複数のバイトと値のエンディアンを指定できます

欠点..

扱うデータのタイプと長さを本当に知る必要があります

6
Hovo

次のようなものを使用して、バイナリデータを保持する文字列を作成できるはずです。

data = "fef0babe"
bits = ""
for x in xrange(0, len(data), 2)
  bits += chr(int(data[x:x+2], 16))

これはおそらく最速の方法ではなく(多くの文字列の追加)、コアPythonのみを使用する非常に簡単な方法です。

2
unwind

Python標準ライブラリで Codecsモジュール を使用できます。

import codecs

codecs.decode(hexstring, 'hex_codec')
0
velsim