プログラミング

Pythonで16進数を10進数に変換するには?int関数の使い方も!(hex to int:基数変換:文字列変換:数値変換:進数変換など)

当サイトでは記事内に広告を含みます

Pythonでプログラミングをしていると、16進数の文字列を10進数に変換したい場面に遭遇することがあります。カラーコードの解析やバイナリデータの処理など、様々な用途で必要になるでしょう。

16進数から10進数への変換は、int関数に基数16を指定するだけで簡単に実現できます。この方法を使えば、”FF”のような16進数文字列を255という10進数の整数に変換できるのです。

また、逆に10進数を16進数に変換するhex関数や、他の進数(2進数、8進数)との変換方法も理解しておくと、数値処理の幅が大きく広がります。基数変換は一見難しそうに見えますが、Pythonでは非常にシンプルに扱えるのが特徴でしょう。

本記事では、Pythonで16進数を10進数に変換する方法を中心に、int関数の詳しい使い方、エラー処理、実践的な応用例まで解説していきます。進数変換の基本をマスターして、データ処理のスキルを向上させましょう。

Pythonで16進数を10進数に変換する基本的な方法

それではまず、16進数を10進数に変換する基本的な方法について解説していきます。

int関数による16進数変換の基本

Pythonで16進数を10進数に変換するには、int関数の第2引数に16を指定します。これにより、第1引数の文字列を16進数として解釈して整数に変換できるのです。

# 基本的な16進数から10進数への変換
hex_string = "FF"
decimal_value = int(hex_string, 16)
print(decimal_value)  # 255様々な16進数の変換
print(int(“10”, 16))  # 16
print(int(“100”, 16))  # 256
print(int(“FFFF”, 16))  # 65535
print(int(“1A3”, 16))  # 419

int関数の構文は`int(文字列, 基数)`となっています。第2引数の基数を省略すると10進数として解釈されますが、明示的に16を指定することで16進数として扱われるわけです。

この方法なら、16進数の知識がなくても簡単に変換できるでしょう。Pythonが自動的に計算してくれます。

int関数は文字列を整数に変換する汎用的な関数で、基数を指定することで様々な進数に対応できます。

0xプレフィックス付き16進数の変換

16進数には、0xというプレフィックスが付いている場合があります。この場合も問題なく変換可能です。

# 0xプレフィックス付きの変換
hex_with_prefix = "0xFF"
decimal = int(hex_with_prefix, 16)
print(decimal)  # 255プレフィックスありなしどちらも対応
print(int(“0x10”, 16))  # 16
print(int(“10”, 16))  # 16(同じ結果)
大文字小文字も問わない
print(int(“0xff”, 16))  # 255
print(int(“0xFF”, 16))  # 255
print(int(“0Xff”, 16))  # 255(すべて同じ)

int関数は0xプレフィックスの有無を自動的に判断してくれます。また、アルファベット部分の大文字小文字も区別しません。

この柔軟性により、様々な形式の16進数データを統一的に処理できるでしょう。

大文字・小文字の扱い

16進数のアルファベット部分(A-F)は、大文字でも小文字でも正しく変換されます。

# 大文字小文字の混在もOK
values = ["abcd", "ABCD", "AbCd", "aBcD"]for hex_str in values:
    result = int(hex_str, 16)
    print(f”{hex_str} → {result}”)
出力:
abcd → 43981
ABCD → 43981
AbCd → 43981
aBcD → 43981(すべて同じ値)

以下の表で、よく使われる16進数と10進数の対応を確認してみましょう。

16進数 10進数 用途例
FF 255 RGB最大値、1バイト最大
100 256 1キロバイト(16進)
FFFF 65535 2バイト最大値
1000 4096 4KB
10000 65536 64KB

int関数の詳しい使い方と応用

続いては、int関数をより深く理解するため、様々な使い方を確認していきます。

基数指定の仕組みと他の進数

int関数の基数指定は、16進数だけでなく2進数から36進数まで対応しています。

# 2進数(基数2)
binary = "1010"
print(int(binary, 2))  # 108進数(基数8)
octal = “12”
print(int(octal, 8))  # 10
16進数(基数16)
hexadecimal = “A”
print(int(hexadecimal, 16))  # 10
基数0を指定すると自動判定
print(int(“0b1010”, 0))  # 10(2進数)
print(int(“0o12”, 0))  # 10(8進数)
print(int(“0xA”, 0))  # 10(16進数)
print(int(“10”, 0))  # 10(10進数)

基数0を指定すると、プレフィックス(0b、0o、0x)から自動的に進数を判定してくれます。これは複数の進数が混在するデータを処理する際に便利でしょう。

進数 基数 プレフィックス 使用文字
2進数 2 0b 0-1
8進数 8 0o 0-7
10進数 10 なし 0-9
16進数 16 0x 0-9, A-F

複数の16進数をまとめて変換

リストやループを使えば、複数の16進数を効率的に変換できます。

# リスト内包表記で一括変換
hex_list = ["10", "20", "FF", "100", "FFFF"]
decimal_list = [int(h, 16) for h in hex_list]
print(decimal_list)  # [16, 32, 255, 256, 65535]RGBカラーコードの分解
color_code = “FF5733”
2文字ずつ分割して変換
red = int(color_code[0:2], 16)
green = int(color_code[2:4], 16)
blue = int(color_code[4:6], 16)
print(f”R: {red}, G: {green}, B: {blue}”)
出力: R: 255, G: 87, B: 51
より簡潔な書き方
r, g, b = [int(color_code[i:i+2], 16) for i in range(0, 6, 2)]
print(f”R: {r}, G: {g}, B: {b}”)

このように、スライスやループと組み合わせることで、構造化されたデータの変換も簡単に行えるでしょう。

バイト列からの16進数変換

バイナリデータを扱う際は、bytes型から16進数文字列を経由して10進数に変換することもあります。

# バイト列を16進数文字列に変換
data = b'\xff\x5a\x3c'hex()メソッドで16進数文字列化
hex_string = data.hex()
print(hex_string)  # ff5a3c
各バイトを10進数に変換
for byte in data:
    print(f”0x{byte:02x} → {byte}”)
出力:
0xff → 255
0x5a → 90
0x3c → 60
16進数文字列を2文字ずつ10進数に
hex_str = “ff5a3c”
bytes_decimal = [int(hex_str[i:i+2], 16) for i in range(0, len(hex_str), 2)]
print(bytes_decimal)  # [255, 90, 60]

バイナリデータの処理では、このような変換が頻繁に必要になります。int関数を使いこなすことで、データの可視化やデバッグが容易になるでしょう。

エラー処理と例外対応

次に、16進数変換時に発生する可能性のあるエラーと、その対処方法を見ていきます。

ValueErrorの発生条件

不正な文字列をint関数に渡すと、ValueErrorが発生します。

# エラーが発生する例
invalid_inputs = ["XYZ", "G1", "12.5", "", "0xGG"]for invalid in invalid_inputs:
    try:
        result = int(invalid, 16)
        print(f”{invalid} → {result}”)
    except ValueError as e:
        print(f”{invalid} → エラー: {e}”)
出力例:
XYZ → エラー: invalid literal for int() with base 16: ‘XYZ’
G1 → エラー: invalid literal for int() with base 16: ‘G1’
12.5 → エラー: invalid literal for int() with base 16: ‘12.5’

16進数で使用できる文字は0-9とA-F(大文字小文字問わず)のみです。それ以外の文字が含まれるとValueErrorが発生します。

安全な変換処理の実装

実用的なプログラムでは、エラー処理を適切に行うことが重要です。

# 安全な変換関数
def safe_hex_to_int(hex_str, default=None):
    """16進数文字列を安全に10進数に変換"""
    try:
        return int(hex_str, 16)
    except ValueError:
        return default使用例
print(safe_hex_to_int(“FF”))  # 255
print(safe_hex_to_int(“XYZ”))  # None
print(safe_hex_to_int(“XYZ”, 0))  # 0(デフォルト値)
バリデーション付き変換
def validated_hex_to_int(hex_str):
    ””“入力をバリデーションしてから変換”””
    # 空文字チェック
    if not hex_str:
        raise ValueError(“空文字列は変換できません”)
    
    # 0xプレフィックスを除去
    cleaned = hex_str.replace(“0x”, “”).replace(“0X”, “”)
    
    # 有効な文字のみかチェック
    valid_chars = set(“0123456789ABCDEFabcdef”)
    if not all(c in valid_chars for c in cleaned):
        raise ValueError(f”不正な16進数文字列: {hex_str}”)
    
    return int(cleaned, 16)
テスト
try:
    print(validated_hex_to_int(“0xFF”))  # 255
    print(validated_hex_to_int(“ABC”))  # 2748
    print(validated_hex_to_int(“XYZ”))  # エラー
except ValueError as e:
    print(f”エラー: {e}”)

このようなエラーハンドリングを実装することで、ユーザー入力や外部データの処理が安全に行えるようになります。

入力データのサニタイズ

ユーザー入力や外部データを扱う場合は、事前に不要な文字を取り除くことも有効です。

# 入力のクリーンアップ
def clean_hex_input(user_input):
    """ユーザー入力から有効な16進数文字列を抽出"""
    # 前後の空白を削除
    cleaned = user_input.strip()
    
    # 0xプレフィックスを削除
    if cleaned.startswith(("0x", "0X")):
        cleaned = cleaned[2:]
    
    # #プレフィックスを削除(カラーコード用)
    if cleaned.startswith("#"):
        cleaned = cleaned[1:]
    
    # 大文字に統一
    cleaned = cleaned.upper()
    
    return cleaned使用例
inputs = [”  0xFF  “, “#FF5733”, “0xABCD”, “  abc  “]
for user_input in inputs:
    cleaned = clean_hex_input(user_input)
    result = int(cleaned, 16)
    print(f”{user_input!r} → {cleaned} → {result}”)
出力:
’  0xFF  ’ → FF → 255
‘#FF5733’ → FF5733 → 16733491
‘0xABCD’ → ABCD → 43981
’  abc  ’ → ABC → 2748

入力のサニタイズにより、様々な形式のデータを柔軟に処理できるようになります。Webアプリケーションやユーザー向けツールでは特に重要なテクニックでしょう。

実践的な応用例とテクニック

最後に、16進数から10進数への変換を活用した実践的な例を確認していきます。

カラーコードの処理

Web開発では、HTMLやCSSのカラーコードを扱う機会が多くあります。

# カラーコードを10進数RGB に変換
def hex_to_rgb(hex_color):
    """#RRGGBB形式のカラーコードをRGBタプルに変換"""
    # #を除去
    hex_color = hex_color.lstrip('#')
    
    # 3桁形式を6桁に展開
    if len(hex_color) == 3:
        hex_color = ''.join([c*2 for c in hex_color])
    
    # RGBに分解
    r = int(hex_color[0:2], 16)
    g = int(hex_color[2:4], 16)
    b = int(hex_color[4:6], 16)
    
    return (r, g, b)使用例
colors = [”#FF5733”, “#00FF00”, “#ABC”, “#000000”]
for color in colors:
    rgb = hex_to_rgb(color)
    print(f”{color} → RGB{rgb}”)
出力:
#FF5733 → RGB(255, 87, 51)
#00FF00 → RGB(0, 255, 0)
#ABC → RGB(170, 187, 204)
#000000 → RGB(0, 0, 0)
RGB値からCSS文字列を生成
def rgb_to_css(r, g, b):
    ””“RGB値からCSS用の文字列を生成”””
    return f”rgb({r}, {g}, {b})”
hex_color = “#FF5733”
r, g, b = hex_to_rgb(hex_color)
css_string = rgb_to_css(r, g, b)
print(css_string)  # rgb(255, 87, 51)

このように、16進数のカラーコードと10進数のRGB値を相互変換することで、様々な色の計算や加工が可能になります。

IPアドレスの16進数表現

ネットワーク関連の処理では、IPアドレスを16進数で扱うことがあります。

# IPアドレスを16進数に変換
def ip_to_hex(ip_address):
    """IPアドレスを16進数文字列に変換"""
    octets = ip_address.split('.')
    hex_parts = [f"{int(octet):02X}" for octet in octets]
    return ''.join(hex_parts)16進数からIPアドレスに変換
def hex_to_ip(hex_str):
    ””“16進数文字列をIPアドレスに変換”””
    octets = []
    for i in range(0, 8, 2):
        octet = int(hex_str[i:i+2], 16)
        octets.append(str(octet))
    return ‘.’.join(octets)
使用例
ip = “192.168.1.1”
hex_ip = ip_to_hex(ip)
print(f”{ip} → 0x{hex_ip}”)  # 192.168.1.1 → 0xC0A80101
逆変換
restored_ip = hex_to_ip(hex_ip)
print(f”0x{hex_ip} → {restored_ip}”)  # 0xC0A80101 → 192.168.1.1

IPアドレスの16進数表現は、ネットワーク計算やサブネット処理で役立つでしょう。

バイナリファイルの解析

バイナリファイルを読み込んで、その内容を16進数経由で解析する例です。

# バイナリファイルのヘッダー解析
def analyze_file_header(filepath):
    """ファイルの最初の16バイトを16進数で表示"""
    with open(filepath, 'rb') as f:
        header = f.read(16)
    
    # 16進数文字列に変換
    hex_str = header.hex()
    
    # 2文字ずつ分割して表示
    hex_bytes = [hex_str[i:i+2] for i in range(0, len(hex_str), 2)]
    print("Hex:", ' '.join(hex_bytes))
    
    # 10進数でも表示
    decimal_bytes = [int(b, 16) for b in hex_bytes]
    print("Dec:", ' '.join(map(str, decimal_bytes)))
    
    return hex_bytesPNGファイルのシグネチャ確認
def is_png_file(filepath):
    ””“PNGファイルかどうかをシグネチャで判定”””
    png_signature = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]
    
    with open(filepath, ‘rb’) as f:
        header = f.read(8)
    
    # 各バイトを16進数経由で10進数に変換して比較
    file_bytes = [int(f”{b:02x}”, 16) for b in header]
    
    return file_bytes == png_signature
16進数ダンプの作成
def hex_dump(data, bytes_per_line=16):
    ””“バイナリデータの16進数ダンプを生成”””
    for i in range(0, len(data), bytes_per_line):
        chunk = data[i:i+bytes_per_line]
        
        # アドレス部分(16進数)
        address = f”{i:08X}”
        
        # 16進数表示
        hex_part = ’ ’.join(f”{b:02X}” for b in chunk)
        
        # ASCII表示
        ascii_part = ‘’.join(chr(b) if 32 <= b < 127 else ‘.’ for b in chunk)
        
        print(f”{address}  {hex_part:<48}  {ascii_part}”)
サンプルデータでテスト
sample = b”Hello, World! This is binary data.\x00\xFF”
hex_dump(sample)

バイナリファイルの解析では、16進数表現が人間にとって読みやすく、デバッグも容易になります。ファイル形式の判定やデータ構造の確認に活用できるでしょう。

まとめ

本記事では、Pythonで16進数を10進数に変換する方法について詳しく解説しました。

基本的な変換は、int関数の第2引数に16を指定するだけで簡単に実現できます。0xプレフィックスの有無や大文字小文字も自動的に処理してくれるため、様々な形式のデータに対応可能です。

エラー処理では、ValueErrorを適切に捕捉し、入力のバリデーションやサニタイズを行うことで、堅牢なプログラムが作れるでしょう。try-except文や事前チェックを組み合わせることが重要です。

実践的な応用例として、カラーコードの処理、IPアドレスの変換、バイナリファイルの解析など、様々な場面で16進数と10進数の変換が活用されています。

int関数の基数指定機能をマスターすることで、2進数や8進数など他の進数変換にも応用でき、データ処理の幅が大きく広がります。ぜひ実際のプロジェクトで活用してみてください。