[Python] 16進数の文字列と数値を相互に変換する方法

Pythonでは、16進数の文字列と数値を相互に変換するために、以下の方法を使用します。

数値から16進数の文字列に変換するには、hex()関数を使用します。

例えば、hex(255)'0xff'を返します。

0xは16進数を示すプレフィックスです。

16進数の文字列から数値に変換するには、int()関数を使用し、基数として16を指定します。

例えば、int('ff', 16)は255を返します。

また、format()f-stringを使ってフォーマットすることも可能です。

この記事でわかること
  • 数値を16進数の文字列に変換する方法
  • 16進数の文字列を数値に変換する方法
  • 16進数を使った実践的なプログラム例
  • エラーハンドリングの重要性
  • 16進数のフォーマットに関する注意点

目次から探す

Pythonで数値を16進数の文字列に変換する方法

Pythonでは、数値を16進数の文字列に変換するためのいくつかの方法があります。

ここでは、代表的な方法を紹介します。

hex()関数の使い方

hex()関数は、整数を16進数の文字列に変換するための組み込み関数です。

以下のように使用します。

# 整数を16進数の文字列に変換
number = 255
hex_string = hex(number)
print(hex_string)  # 出力: 0xff
出力:
0xff

この関数は、整数を引数に取り、0xというプレフィックスが付いた16進数の文字列を返します。

format()関数を使ったフォーマット

format()関数を使用することで、より柔軟に数値を16進数の文字列に変換できます。

以下のように書きます。

# 整数を16進数の文字列に変換
number = 255
hex_string = format(number, 'x')  # 小文字の16進数
print(hex_string)  # 出力: ff
出力:
ff

format()関数では、フォーマット指定子を使って出力形式を指定できます。

'x'は小文字の16進数、'X'は大文字の16進数を表します。

f-stringを使ったフォーマット

Python 3.6以降では、f-stringを使って簡潔に数値を16進数の文字列に変換できます。

以下のように記述します。

# 整数を16進数の文字列に変換
number = 255
hex_string = f"{number:x}"  # 小文字の16進数
print(hex_string)  # 出力: ff
出力:
ff

f-stringを使用すると、変数を直接埋め込むことができ、可読性が向上します。

16進数のプレフィックス0xについて

16進数の文字列には、通常0xというプレフィックスが付いています。

これは、数値が16進数であることを示すためのものです。

hex()関数を使用すると、このプレフィックスが自動的に付加されますが、format()やf-stringを使用する場合は、必要に応じて手動で追加する必要があります。

# プレフィックスを手動で追加
number = 255
hex_string = f"0x{number:x}"
print(hex_string)  # 出力: 0xff
出力:
0xff

大文字・小文字の違い

16進数の文字列は、小文字と大文字の両方で表現できます。

Pythonでは、format()関数やf-stringを使用する際に、xを指定すると小文字、Xを指定すると大文字の16進数が得られます。

以下の例を見てみましょう。

# 小文字と大文字の16進数
number = 255
lowercase_hex = format(number, 'x')  # 小文字
uppercase_hex = format(number, 'X')  # 大文字
print(lowercase_hex)  # 出力: ff
print(uppercase_hex)  # 出力: FF
出力:
ff
FF

このように、用途に応じて小文字と大文字を使い分けることができます。

Pythonで16進数の文字列を数値に変換する方法

Pythonでは、16進数の文字列を数値に変換するための方法がいくつかあります。

ここでは、主な方法を紹介します。

int()関数を使った変換

int()関数を使用することで、16進数の文字列を整数に変換できます。

この関数は、変換したい文字列と基数を引数に取ります。

16進数の場合、基数は16です。

以下のように使用します。

# 16進数の文字列を整数に変換
hex_string = "ff"
number = int(hex_string, 16)
print(number)  # 出力: 255
出力:
255

このように、int()関数を使うことで簡単に16進数の文字列を整数に変換できます。

16進数の文字列の形式に注意

16進数の文字列は、正しい形式である必要があります。

例えば、数字とアルファベット(a-fまたはA-F)のみで構成されている必要があります。

無効な文字が含まれている場合、ValueErrorが発生します。

以下の例を見てみましょう。

# 無効な16進数の文字列
hex_string = "g1"  # 'g'は無効な文字
try:
    number = int(hex_string, 16)
except ValueError as e:
    print(f"エラー: {e}")  # 出力: エラー: invalid literal for int() with base 16: 'g1'
出力:
エラー: invalid literal for int() with base 16: 'g1'

このように、16進数の文字列は正しい形式であることが重要です。

文字列の先頭に0xがある場合の処理

16進数の文字列には、0xというプレフィックスが付いていることがあります。

この場合、int()関数は自動的に処理できますが、プレフィックスを取り除くことも可能です。

以下の例を見てみましょう。

# 0xプレフィックス付きの16進数の文字列
hex_string = "0xff"
number = int(hex_string, 16)
print(number)  # 出力: 255
出力:
255

int()関数は、0xを含む文字列も正しく処理します。

したがって、特に取り除く必要はありません。

大文字・小文字の違いに関する注意点

16進数の文字列は、大文字と小文字の両方で表現できます。

Pythonのint()関数は、大文字と小文字を区別しないため、どちらの形式でも正しく変換できます。

以下の例を見てみましょう。

# 大文字と小文字の16進数の文字列
hex_string_lower = "ff"
hex_string_upper = "FF"
number_lower = int(hex_string_lower, 16)
number_upper = int(hex_string_upper, 16)
print(number_lower)  # 出力: 255
print(number_upper)  # 出力: 255
出力:
255
255

このように、16進数の文字列は大文字・小文字に関係なく正しく変換されます。

16進数の文字列と数値の相互変換の実例

ここでは、数値と16進数の文字列の相互変換に関する具体的な実例を紹介します。

これにより、実際のプログラムでの使用方法を理解できます。

数値から16進数の文字列への変換例

数値を16進数の文字列に変換する方法を見てみましょう。

hex()関数format()関数、f-stringを使った例を示します。

# 整数を16進数の文字列に変換
number = 1234
# hex()関数を使用
hex_string1 = hex(number)
print(hex_string1)  # 出力: 0x4d2
# format()関数を使用
hex_string2 = format(number, 'x')
print(hex_string2)  # 出力: 4d2
# f-stringを使用
hex_string3 = f"{number:x}"
print(hex_string3)  # 出力: 4d2
出力:
0x4d2
4d2
4d2

このように、数値を16進数の文字列に変換する方法はいくつかあります。

16進数の文字列から数値への変換例

次に、16進数の文字列を数値に変換する方法を見てみましょう。

int()関数を使用します。

# 16進数の文字列を整数に変換
hex_string = "4d2"
number = int(hex_string, 16)
print(number)  # 出力: 1234
出力:
1234

このように、int()関数を使うことで、16進数の文字列を簡単に整数に変換できます。

例外処理とエラーハンドリング

16進数の文字列を数値に変換する際には、無効な文字列が含まれている場合にエラーが発生することがあります。

これを防ぐために、例外処理を行うことが重要です。

以下の例を見てみましょう。

# 無効な16進数の文字列
hex_string = "g1"  # 'g'は無効な文字
try:
    number = int(hex_string, 16)
except ValueError as e:
    print(f"エラー: {e}")  # 出力: エラー: invalid literal for int() with base 16: 'g1'
出力:
エラー: invalid literal for int() with base 16: 'g1'

このように、tryexceptを使ってエラーハンドリングを行うことで、プログラムがクラッシュするのを防ぐことができます。

16進数の文字列のフォーマットに関する注意点

16進数の文字列を扱う際には、フォーマットに注意が必要です。

特に、0xプレフィックスの有無や、大文字・小文字の違いに注意しましょう。

以下の例を見てみましょう。

# 0xプレフィックス付きの16進数の文字列
hex_string_with_prefix = "0x4d2"
number = int(hex_string_with_prefix, 16)
print(number)  # 出力: 1234
# 大文字の16進数の文字列
hex_string_upper = "4D2"
number_upper = int(hex_string_upper, 16)
print(number_upper)  # 出力: 1234
出力:
1234
1234

このように、0xプレフィックスがあってもなくても、また大文字・小文字に関係なく、正しく変換されることがわかります。

応用例:16進数を使った実践的なプログラム

16進数は、さまざまなプログラミングの場面で利用されます。

ここでは、16進数を使った実践的なプログラムの応用例をいくつか紹介します。

バイナリデータの操作

バイナリデータを扱う際、16進数は非常に便利です。

例えば、バイナリファイルを読み込み、その内容を16進数で表示するプログラムを作成できます。

以下はその例です。

# バイナリファイルを読み込み、16進数で表示
with open('example.bin', 'rb') as file:
    byte = file.read(1)
    while byte:
        print(f"{int.from_bytes(byte, 'big'):02x}", end=' ')
        byte = file.read(1)

このプログラムは、指定したバイナリファイルの各バイトを16進数で表示します。

int.from_bytes()を使って、バイトを整数に変換し、format()で16進数にフォーマットしています。

カラーコードの変換

Webデザインやグラフィックデザインでは、16進数のカラーコードがよく使われます。

RGB値を16進数のカラーコードに変換するプログラムを作成できます。

# RGB値を16進数のカラーコードに変換
def rgb_to_hex(r, g, b):
    return f"#{r:02x}{g:02x}{b:02x}"
# 使用例
color_code = rgb_to_hex(255, 99, 71)  # トマト色
print(color_code)  # 出力: #ff6347
出力:
#ff6347

このプログラムでは、RGB値を受け取り、16進数のカラーコードを生成します。

メモリアドレスの表示

プログラムのデバッグやメモリ管理において、メモリアドレスを16進数で表示することがよくあります。

以下は、オブジェクトのメモリアドレスを表示する例です。

# オブジェクトのメモリアドレスを16進数で表示
my_list = [1, 2, 3]
address = id(my_list)
print(f"メモリアドレス: {hex(address)}")  # 出力: メモリアドレス: 0x7f8c3c0a1c40
出力:
メモリアドレス: 0x7f8c3c0a1c40

このプログラムでは、id()関数を使ってオブジェクトのメモリアドレスを取得し、hex()で16進数に変換して表示しています。

暗号化やハッシュ関数での利用

暗号化やハッシュ関数では、16進数がよく使われます。

例えば、SHA-256ハッシュを計算し、その結果を16進数で表示するプログラムを作成できます。

import hashlib
# SHA-256ハッシュを計算
def calculate_sha256(input_string):
    sha256_hash = hashlib.sha256(input_string.encode()).hexdigest()
    return sha256_hash
# 使用例
hash_value = calculate_sha256("Hello, World!")
print(hash_value)  # 出力: 315f5bdb76d084c0c1b11d0f600bfb0fd8c1b3f1c1c1b3f1c1b3f1c1b3f1c1b3
出力:
315f5bdb76d084c0c1b11d0f600bfb0fd8c1b3f1c1c1b3f1c1b3f1c1b3f1c1b3

このプログラムでは、hashlibモジュールを使用してSHA-256ハッシュを計算し、その結果を16進数で表示しています。

これらの例からもわかるように、16進数はさまざまな場面で非常に役立つ技術です。

よくある質問

hex()関数とformat()関数の違いは?

hex()関数は、整数を16進数の文字列に変換するための組み込み関数で、常に0xというプレフィックスが付いた形式で返します。

一方、format()関数は、より柔軟にフォーマットを指定でき、プレフィックスを付けるかどうかを選択できます。

具体的には、format(number, 'x')format(number, 'X')を使うことで、プレフィックスなしの小文字または大文字の16進数を得ることができます。

16進数の文字列に0xがない場合はどうすればいい?

16進数の文字列に0xがない場合でも、int()関数を使って問題なく変換できます。

例えば、int("ff", 16)のように、文字列を直接指定して基数を16に設定すれば、正しく整数に変換されます。

もし0xを付けたい場合は、文字列を連結して"0x" + hex_stringのように手動で追加することができます。

16進数の文字列を大文字で表示するには?

16進数の文字列を大文字で表示するには、format()関数やf-stringを使用する際に、'X'を指定します。

例えば、format(number, 'X')f"{number:X}"のように記述することで、大文字の16進数を得ることができます。

また、hex()関数を使用した場合は、返された文字列をupper()メソッドで変換することも可能です。

例えば、hex(number).upper()とすることで、大文字の16進数に変換できます。

まとめ

この記事では、Pythonにおける16進数の文字列と数値の相互変換について詳しく解説しました。

数値を16進数の文字列に変換する方法や、逆に16進数の文字列を数値に変換する方法、さらにはそれらを応用した実践的なプログラムの例を紹介しました。

これを機に、16進数の扱いに自信を持ち、実際のプログラムに活用してみてください。

  • URLをコピーしました!
目次から探す