[Python] 16進数の文字列と数値を相互に変換する方法
Pythonでは、16進数の文字列と数値を相互に変換するために、以下の方法を使用します。
数値から16進数の文字列に変換するには、hex()関数
を使用します。
例えば、hex(255)
は'0xff'
を返します。
0x
は16進数を示すプレフィックスです。
16進数の文字列から数値に変換するには、int()関数
を使用し、基数として16を指定します。
例えば、int('ff', 16)
は255を返します。
また、format()
やf-string
を使ってフォーマットすることも可能です。
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'
このように、try
とexcept
を使ってエラーハンドリングを行うことで、プログラムがクラッシュするのを防ぐことができます。
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進数はさまざまな場面で非常に役立つ技術です。
まとめ
この記事では、Pythonにおける16進数の文字列と数値の相互変換について詳しく解説しました。
数値を16進数の文字列に変換する方法や、逆に16進数の文字列を数値に変換する方法、さらにはそれらを応用した実践的なプログラムの例を紹介しました。
これを機に、16進数の扱いに自信を持ち、実際のプログラムに活用してみてください。