HOWTO · Python

Python で 16 進文字列を Int に変換する

Python で 16 進数を整数に変換する方法を示します。

このページの内容

Python で 16 進文字列を整数に変換するには int(value, 16) を使います。0x 接頭辞を Python に判定させる場合は基数 0 を指定し、バイト順や符号付きのビット幅を指定する場合は int.from_bytes() を使います。

Python で int() を使って 16 進数を整数に変換する

int() 関数は文字列と、省略可能な基数を受け取ります。基数の既定値は 10 なので、16 進文字列には 16 を指定します。int(value, base) の第 2 引数は入力文字列の基数を表し、ビット幅ではありません。value を変換したい 16 進文字列に置き換えてください。

Python で接頭辞のない 16 進文字列を整数に変換する

0x または 0X 接頭辞のない 16 進数の桁には、基数 16 を明示的に指定します。テキストファイル、API、ユーザー入力から値を読み取る場合に便利です。

hex_string = "1a"
integer_value = int(hex_string, 16)
print(integer_value)
26

結果は 26 です。基数 16 を指定すると、int() は各桁を 16 進数として解釈します。文字列に接頭辞が含まれる場合は、基数 16 を使うか、次の例のように int() に接頭辞を判定させることができます。

Python で接頭辞付きの 16 進文字列を整数に変換する

接頭辞付きの 16 進文字列では、基数 0 を指定すると、int() は 0x や 0X などの認識可能な接頭辞から基数を判定します。基数 16 でもこれらの接頭辞を使えます。入力に Python のほかの整数接頭辞が含まれる可能性がある場合は、基数 0 が便利です。

hex_string = "0x1a"
integer_value = int(hex_string, 0)
print(integer_value)
26

文字列が 0x で始まるため、Python は残りの桁を 16 進数として解析し、26 を返します。基数 0 は認識可能な接頭辞を必要とするため、接頭辞のない文字列を自動的に 16 進数として扱うわけではありません。接頭辞がない入力には基数 16 を使ってください。

Python でリトルエンディアンとビッグエンディアンの 16 進文字列を整数に変換する

リトルエンディアンとビッグエンディアンのバイト順は、バイト列を整数に対応付ける方法を表します。16 進文字列だけではバイト順は決まりません。バイト列 ef be では、ビッグエンディアンは ef を先頭のバイトとして扱い、リトルエンディアンは ef を最下位バイトとして扱います。希望する順序を int.from_bytes() に渡します。

data = bytes.fromhex("ef be")
big_value = int.from_bytes(data, byteorder="big")
little_value = int.from_bytes(data, byteorder="little")
print(big_value, little_value)
61374 48879

bytes.fromhex() は 2 バイトの列を作成し、byteorder は各バイトを結果にどう反映するかを指定します。ビッグエンディアンでは 61374、リトルエンディアンでは 48879 になります。16 進文字列を手作業で逆順にせず、バイト順を明示できます。

Python で 16 進数を符号付き整数に変換する

int("ffff", 16) のような通常の呼び出しでは、負でない整数が返されます。16 進数の桁を符号付きの値として解釈するには、バイト幅を決め、そのバイト列を signed=True でデコードします。16 ビット値では、ffff は2の補数表現で -1 を表します。

hex_string = "ffff"
data = bytes.fromhex(hex_string)
signed_value = int.from_bytes(data, byteorder="big", signed=True)
print(signed_value)
-1

bytes.fromhex("ffff") は 2 バイトを指定するため、この符号付き変換の幅は 16 ビットとなり、-1 が返されます。最上位ビットが立っており、2の補数によって符号付きの値が決まります。デコードするデータ形式に合わせてバイト順と幅を選んでください。int() だけでは、どちらも判定されません。