回答:
あなたの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
。
string
> bytes
オブジェクトを探している場合は、 `bytes.fromhex(" 000102030405060708090A0B0C0D0E0F ")`となり、が生成されb'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
ます。質問はバイト配列を要求するため、回答として投稿するのではなく、バイトの次数を検索したときに最初にヒットしたため、ここに投稿します。
hex_string.decode("hex")
は、Python 2.7に取り組んでいます。でテストしましたPython 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
。
bytes.fromhex
入力文字列の文字数が奇数の場合、エラーがスローされることに注意してください:bytes.fromhex("aab")
→ ValueError: non-hexadecimal number found in fromhex() arg at position 3
。
意図したことを行う組み込み関数がbytearrayにあります。
bytearray.fromhex("de ad be ef 00")
バイト配列を返し、スペース区切りの有無にかかわらず16進文字列を読み取ります。
hex_string.decode("hex")
が、機能しません。
私が正しく理解していれば、binascii.unhexlifyを探す必要があります
import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
unhexlify
が最も効率的な方法であることに同意しますが、b = bytearray(s)
を使用するよりも優れていることをお勧めしord
ます。Pythonにはバイトの配列専用の組み込み型があるので、誰もそれを使用していないことに驚いています
あなたがそのようなバイト文字列を持っていると仮定します
「\ 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ビット)に等しい
利点は..
複数のバイトと値のエンディアンを指定できます
短所...
処理するデータのタイプと長さを本当に知る必要がある
Python標準ライブラリのコーデックモジュールを使用できます。
import codecs
codecs.decode(hexstring, 'hex_codec')
def hex2bin(s):
hex_table = ['0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011',
'1100', '1101', '1110', '1111']
bits = ''
for i in range(len(s)):
bits += hex_table[int(s[i], base=16)]
return bits
良いワンライナーは:
byte_list = map(ord, hex_string)
これにより、文字列の各文字が反復処理され、ord()関数で実行されます。Python 2.6でのみテストされています。3.0以降についてはあまり確信が持てません。
-ジョシュ
byte_list = bytearray(hex_string)