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

Rayven Esplanada 2023年10月10日
  1. Python で int() を使用して 16 進数を整数に変換する
  2. Python で接頭辞のない 16 進文字列を Int に変換する
  3. Python でプレフィックス付き 16 進文字列を Int に変換する
  4. Python でリトルエンディアンとビッグエンディアンの 16 進文字列を Int に変換する
  5. Python で 16 進数を符号付き整数に変換する
Python で 16 進文字列を Int に変換する

このチュートリアルでは、Python で 16 進文字列を int に変換する方法を説明します。符号付き、リトルエンディアン、ビッグエンディアン、0x 注釈付き 16 進数、デフォルトの 16 進文字列のような異なる 16 進形式を扱います。

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

Python で 16 進数を整数に変換する最も一般的で効果的な方法は、型キャスト関数 int() を利用することです。

この関数は 2つの引数を受け付けます。1つ目の必須引数は変換する値であり、2つ目のオプション引数は数値フォーマットの基底値であり、デフォルトは 10 です。

他の数値フォーマットとしては、2 進数なら 2、8 進数なら 8、16 進数なら 16 があります。基底値の引数に 0 を指定すると、値の接頭辞から数値フォーマットを導き出します。接頭辞がない場合は 10 進数、2 進数なら 0b、8 進数なら 0o、16 進数なら 0x と自動的に認識されます。

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

16 進文字列が接頭辞なしの場合は、int() 関数の基底値に 16 を指定します。

例えば:

hex_val = "beef101"

print(int(hex_val, 16))

出力:

200208641

結果は 16 進数の値 beef101 の 10 進数または整数変換です。

Python でプレフィックス付き 16 進文字列を Int に変換する

16 進文字列に接頭辞 0x がある場合は、基底値の引数を 0 に変更して接頭辞を自動的に検出するようにします。

16 を基底値として渡しても構いませんが、異なる数値フォーマットの複数の値を扱う場合は 0 を渡すのが最善の方法です。

hex_val = "0xdeadcab"

print(int(hex_val, 0))
print(int(hex_val, 16))

出力:

233495723
233495723

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

リトルエンディアンとビッグエンディアンのバイトオーダーは、16 進数の 2 種類のオーダーシステムです。デフォルトの順序はリトルエンディアンであり、これは最も重要な数字を右端に配置しますが、ビッグエンディアンはその逆を行います。

それを念頭に置いて、考慮しなければならないのは、ビッグエンディアンの 16 進数の値をリトルエンディアンに変換することです。その後、通常の変換を行うことができます。

大エンディアンの 16 進文字列をリトルエンディアンに変換するには、bytearray.fromhex() を用い、その結果に対して関数 reverse() を用います。その後、16 進数の値を文字列に戻して整数に変換します。

big_endian = "efbe"


def to_little(val):
    little_hex = bytearray.fromhex(val)
    little_hex.reverse()
    print("Byte array format:", little_hex)

    str_little = "".join(format(x, "02x") for x in little_hex)

    return str_little


little_endian = to_little(big_endian)

print("Little endian hex:", little_endian)
print("Hex to int:", int(little_endian, 16))

コードブロックの概要は以下の通りです。

  • bytearray.fromhex() を呼び出して、ビッグエンディアンの 16 進文字列をバイト配列の 16 進数値に変換します。
  • バイト配列を逆にして、ビッグエンディアンをリトルエンディアン形式に変換します。
  • バイト配列の値をリトルエンディアンの 16 進数形式の文字列に戻す。
  • int() を用いて文字列を整数に変換します。

出力:

Byte array format: bytearray(b'\xbe\xef')
Little endian hex: beef
Hex to int: 48879

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

任意の数値フォーマットを符号付き整数に変換するには、2 の補数と呼ばれる演算が必要になりますが、これは符号付き数値を計算するビット単位の数学演算です。

ですから、16 進数を符号付き整数に変換する前に、2 の補数演算を実行する関数を定義する必要があります。

def twosComplement_hex(hexval):
    bits = 16  # Number of bits in a hexadecimal number format
    val = int(hexval, bits)
    if val & (1 << (bits - 1)):
        val -= 1 << bits
    return val

2 進数の値の左端のビットは符号付きビットと呼ばれ、整数が正か負かを判断します。この関数はそのビットを符号付きビットとして確保し、ビット単位の左シフト演算子 << を用いて他のビットをシフトして補います。

さて、実際に 16 進数の値を符号付き整数に変換してみましょう。

hex_val1 = "ff"
hex_val2 = "ffff"
hex_val3 = "aaff"


def twosComplement_hex(hexval):
    bits = 16
    val = int(hexval, bits)
    if val & (1 << (bits - 1)):
        val -= 1 << bits
    return val


print(twosComplement_hex(hex_val1))
print(twosComplement_hex(hex_val2))
print(twosComplement_hex(hex_val3))

出力:

255
-1
-21761

これで、16 進文字列を符号付き整数に変換することができました。

要約すると、異なるタイプの 16 進数形式を符号付き整数と符号なし整数に変換する方法を説明しました。16 進数を符号なし整数に変換するには、値と基底引数に int() を使ってください。

16 進数がビッグエンディアン形式の場合は、まず bytearray.fromhex()reverse() を用いてリトルエンディアン形式に変換します。

最後に、16 進文字列を符号付き整数に変換する必要がある場合は、16 進数の値に対して 2 の補数演算を行い、符号付き整数の値を取得します。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

関連記事 - Python Hex

関連記事 - Python Integer