Pythonで16進数と10進数を変換する方法を初心者向けに解説!int関数・hex関数・実務での使いどころまで
Pythonで数値を扱っていると、たまに16進数という表記に出会います。 普段の生活では10進数を使うことが多いので、0x1fやffのような値を見ると、少し身構えてしまう方もいるかもしれません。
Pythonでは、16進数と10進数の変換はint関数とhex関数を使えばかなりシンプルにできます。
この記事では、IT初心者の方にもわかるように、16進数とは何か、Pythonでどう変換するのか、エラーが出たときにどこを見ればよいのかを順番に解説します。
Pythonで16進数と10進数を変換する前に知っておきたいこと¶
ここではまず、16進数と10進数の違いを整理しておきましょう。
10進数とは、普段使っている数の数え方¶
10進数は、私たちが日常で使っている数の表し方です。 0から9までの10種類の数字を使い、9の次は桁が上がって10になります。
たとえば、10進数の15はそのまま15です。 100円、25人、3個のように、生活の中で自然に使っている数が10進数だと思って大丈夫です。
Pythonでも、特別な書き方をしなければ数値は基本的に10進数として扱われます。 以下のように書いた場合、numberには10進数の15が入ります。
number = 15
print(number)
初心者のうちは、数値を書いたら10進数として扱われる、と覚えておくと混乱しにくいです。 まずはここが土台です。
16進数とは、0からfまでを使う数の表し方¶
16進数は、0から9までの数字に加えて、aからfまでのアルファベットを使います。 つまり、16種類の記号で数を表す方法です。
10進数では9の次が10になります。 一方で16進数では、9の次がa、b、c、d、e、fと続き、その次に10になります。
少し不思議ですよね。 ただし、16進数の10は10進数の10ではなく、10進数でいう16を意味します。
この違いが最初のつまずきポイントです。 表にすると、関係が少し見えやすくなります。
| 10進数 | 16進数 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 9 | 9 |
| 10 | a |
| 15 | f |
| 16 | 10 |
| 31 | 1f |
| 255 | ff |
16進数では、10進数の255がffになります。 このffは画像処理やWebの色コードでもよく出てくる値です。
Pythonでは16進数に0xが付くことが多い¶
Pythonで16進数を数値として直接書くときは、先頭に0xを付けます。 たとえば0x10は、10進数の16を意味します。
number = 0x10
print(number)
このコードを実行すると、出力は16になります。 Pythonは0xが付いた数値を見て、これは16進数だなと判断してくれるからです。
ちなみに0Xのように大文字で書いても動きます。 ただ、実務では小文字の0xをよく見かけます。
Pythonで16進数を10進数に変換する方法¶
ここからは実際にPythonで変換していきます。 まずは、16進数の文字列を10進数の整数に変換する方法です。
16進数の文字列を10進数に変換するときは、int関数を使います。 ポイントは、第2引数に16を指定することです。
int関数で16進数文字列を10進数に変換する¶
int関数は、文字列を整数に変換するためによく使われます。 16進数を扱う場合は、int(文字列, 16)と書きます。
hex_text = "1f"
decimal_number = int(hex_text, 16)
print(decimal_number)
このコードの出力は31です。 16進数の1fは、10進数では31になります。
ここで大事なのは、"1f"が文字列であることです。 Pythonに対して、この文字列は16進数として読んでください、と伝えるために第2引数の16を指定しています。
0x付きの文字列もint関数で変換できる¶
ログやAPIのレスポンスでは、0x1fのように0xが付いた文字列が出てくることがあります。 この場合も、int関数で変換できます。
hex_text = "0x1f"
decimal_number = int(hex_text, 16)
print(decimal_number)
出力は同じく31です。 Pythonのint関数は、baseに16を指定していれば0x付きの文字列も解釈してくれます。
初心者の方は、0xが付いていると別の処理が必要なのかなと不安になるかもしれません。 でも、基本的にはそのままint関数に渡して大丈夫です。
大文字のAからFも変換できる¶
16進数ではaからfを使いますが、大文字のAからFも使われることがあります。 Pythonのint関数は、大文字でも小文字でも変換できます。
print(int("ff", 16))
print(int("FF", 16))
print(int("Ff", 16))
このコードは、すべて255を出力します。 大文字小文字の違いでエラーになるわけではありません。
ただし、プロジェクト内では表記をそろえたほうが読みやすくなります。 私の実務経験では、出力は小文字に統一し、入力は大文字小文字どちらでも受け入れる設計にすることが多いです。
16進数を10進数に変換する処理を関数にする¶
同じ変換を何度も使うなら、関数にしておくと便利です。 処理の意味が名前に出るので、コードも読みやすくなります。
def hex_to_decimal(hex_text):
return int(hex_text, 16)
print(hex_to_decimal("1f"))
print(hex_to_decimal("ff"))
print(hex_to_decimal("0x10"))
このように関数化すると、何をしている処理なのかがすぐにわかります。 小さな処理でも名前を付けることで、あとから読む自分にやさしいコードになります。
コードを読みやすくする考え方をあわせて知りたい方は以下の記事も参考にしてください。 【関連記事】Pythonの型ヒントをどうやって使うの?リーダブルコードに必須な型チェック
Pythonで10進数を16進数に変換する方法¶
次は反対に、10進数を16進数へ変換する方法を見ていきます。 こちらはhex関数を使います。
hex関数は、整数を16進数の文字列に変換するための関数です。 Pythonでは標準で用意されているので、追加のライブラリは必要ありません。
hex関数で10進数を16進数に変換する¶
まずは一番基本の使い方です。 10進数の31を16進数に変換してみましょう。
number = 31
hex_text = hex(number)
print(hex_text)
このコードの出力は0x1fです。
hex関数の戻り値は文字列で、先頭に0xが付きます。
ここは意外と大切です。 hex関数の結果は数値ではなく文字列なので、あとで文字列操作をすることもできます。
0xを外して16進数だけを表示する¶
Web画面やファイル出力では、0xを付けずに1fだけ表示したいこともあります。 その場合は、文字列のスライスを使って先頭2文字を取り除く方法があります。
number = 31
hex_text = hex(number)
hex_without_prefix = hex_text[2:]
print(hex_without_prefix)
出力は1fです。 hex(number)の結果が0x1fなので、[2:]で3文字目以降を取り出しています。
ただし、個人的にはformat関数やf-stringを使う書き方のほうが好みです。 理由は、0xを削るという発想よりも、最初から欲しい形式で出すほうが読みやすいからです。
format関数で0xなしの16進数に変換する¶
format関数を使うと、0xなしの16進数を簡単に作れます。 書式にxを指定すると、小文字の16進数になります。
number = 31
hex_text = format(number, "x")
print(hex_text)
出力は1fです。 0xは付きません。
大文字で出したい場合は、Xを指定します。
number = 255
print(format(number, "x"))
print(format(number, "X"))
出力はffとFFになります。 用途に応じて小文字と大文字を使い分けましょう。
f-stringで16進数に変換する¶
Pythonに慣れてきたら、f-stringで書く方法もおすすめです。 f-stringは文字列の中に変数を埋め込める書き方で、表示用の整形にもよく使います。
number = 255
print(f"{number:x}")
print(f"{number:X}")
このコードも、ffとFFを出力します。 短く書けて読みやすいので、実務でもよく使います。
文字列の整形をもう少し深く知りたい方は、以下の記事もご覧ください。 【関連記事】Pythonのf-stringとは?デバッグが驚くほど楽になる!
Pythonの16進数と10進数変換の早見表¶
ここまでの内容を一度整理しましょう。 何をしたいかによって、使う関数や書き方が少し変わります。
次の表を見れば、基本的な変換パターンはひと通り確認できます。
| やりたいこと | 書き方 | 結果の例 | 補足 |
|---|---|---|---|
| 16進数文字列を10進数にする | int("1f", 16) | 31 | 0xなしでもOK |
| 0x付き文字列を10進数にする | int("0x1f", 16) | 31 | そのまま変換できる |
| 10進数を0x付き16進数にする | hex(31) | "0x1f" | 戻り値は文字列 |
| 10進数を0xなし16進数にする | format(31, "x") | "1f" | 表示用に便利 |
| 10進数を大文字16進数にする | format(255, "X") | "FF" | 大文字指定 |
| f-stringで16進数にする | f"{255:x}" | "ff" | 実務でも使いやすい |
最初はこの表を見ながら書けば十分です。 慣れてくると、自然にintとformatを使い分けられるようになります。
16進数変換で初心者がつまずきやすいポイント¶
16進数と10進数の変換はシンプルですが、初心者のうちはいくつかハマりやすいポイントがあります。 エラーを見ると焦ってしまうかもしれませんが、原因はだいたい限られています。
ここでは、よくあるつまずきを具体的に見ていきます。
int関数の第2引数を忘れてしまう¶
16進数の文字列をint関数に渡すとき、第2引数の16を忘れるとエラーになることがあります。 たとえば、次のコードを見てください。
print(int("1f"))
このコードはエラーになります。 Pythonが"1f"を普通の10進数として読もうとするからです。
10進数の世界ではfという文字は数字として使えません。 そのため、これは整数にできない文字列です、というエラーになります。
正しくは、次のように書きます。
print(int("1f", 16))
第2引数の16は、16進数として読んでくださいという指定です。 ここを忘れないようにしましょう。
0x付きの文字列を自分で削りすぎる¶
0x1fのような文字列を見ると、0xを削ってから変換しないといけないと思うかもしれません。 実際には、int("0x1f", 16)でそのまま変換できます。
print(int("0x1f", 16))
もちろん、0xを削ってからint("1f", 16)としても動きます。 ただ、必要以上に文字列加工を増やすと、別のバグが入りやすくなります。
私が現場でコードレビューをするときも、無理に加工している処理は少し注意して見ます。 Pythonが標準で対応しているなら、素直にその機能を使ったほうが安全です。
16進数に使えない文字が混ざっている¶
16進数で使える文字は、0から9とaからfです。 それ以外の文字が混ざっていると、変換時にエラーになります。
print(int("1g", 16))
このコードはエラーになります。 gは16進数では使えない文字だからです。
ユーザー入力や外部ファイルから読み込んだ値を変換する場合は、変な文字が混ざる可能性があります。 そのため、try-exceptでエラー処理を入れておくと安心です。
def safe_hex_to_decimal(hex_text):
try:
return int(hex_text, 16)
except ValueError:
return None
print(safe_hex_to_decimal("1f"))
print(safe_hex_to_decimal("1g"))
この例では、変換できない場合にNoneを返しています。 実務では、エラーメッセージを表示したり、ログに残したりすることもあります。
エラー処理の考え方を学びたい方は、こちらの記事もご覧ください。 【関連記事】Pythonの例外処理のアンチパターン5選をご紹介!|初心者がやりがちな「べからず集」
実務でよくある16進数と10進数の変換例¶
16進数は、学習中だけ出てくる特殊な知識ではありません。 実務でも意外とよく見かけます。
特に、Web、画像、通信、ログ、バイナリファイルの分野ではよく登場します。 ここでは、初心者にもイメージしやすい例を紹介します。
カラーコードを10進数のRGBに変換する¶
Webデザインでは、#ff8800のようなカラーコードをよく使います。 これは、赤、緑、青の値を16進数で表したものです。
ff8800は、赤がff、緑が88、青が00という意味です。 これを10進数に変換すると、赤255、緑136、青0になります。
color_code = "#ff8800"
red = int(color_code[1:3], 16)
green = int(color_code[3:5], 16)
blue = int(color_code[5:7], 16)
print(red, green, blue)
このコードの出力は、255 136 0です。 色コードの仕組みが少し見えてきますね。
私はWeb系の案件で、デザインツールから渡されたカラーコードをプログラム側で分解する処理を書いたことがあります。 そのときも、やっていることは結局このint関数による変換でした。
RGBの10進数をカラーコードに変換する¶
反対に、赤、緑、青の10進数からカラーコードを作ることもできます。 この場合は、f-stringの書式指定を使うときれいに書けます。
red = 255
green = 136
blue = 0
color_code = f"#{red:02x}{green:02x}{blue:02x}"
print(color_code)
出力は#ff8800です。 ここで使っている02xは、2桁の16進数にして、足りない場合は0で埋めるという意味です。
たとえば0をそのまま16進数にすると0です。 しかしカラーコードでは00のように2桁で表す必要があるため、02xが役に立ちます。
ログに出てきたエラーコードを読む¶
システムのログには、16進数のエラーコードが出てくることがあります。 たとえば0x10や0xffのような値です。
人間が読みやすいように10進数へ変換したい場合は、int関数を使います。
error_code = "0xff"
print(int(error_code, 16))
出力は255です。 仕様書やドキュメントで10進数表記のエラー一覧がある場合、こうした変換が役に立ちます。
実務では、ログに出た値とドキュメント上の値の表記が違うことがよくあります。 片方は16進数、片方は10進数というだけで、意味としては同じ値というケースもあるので注意しましょう。
バイト列を16進数で表示する¶
通信やファイル処理では、bytes型を16進数で表示したいことがあります。 Pythonのbytesにはhexメソッドがあります。
data = b"ABC"
print(data.hex())
出力は414243です。 A、B、Cがそれぞれ16進数の41、42、43として表示されています。
この知識は少し発展的ですが、ファイルの中身を確認したり、APIの署名処理を理解したりするときに役立ちます。 最初は、バイト列も16進数で見える化できるんだな、くらいの理解で十分です。
int関数のbaseを理解すると変換がもっとわかる¶
ここまでint("1f", 16)を何度も使ってきました。 この第2引数の16はbaseと呼ばれるもので、何進数として読むかを指定します。
baseの考え方がわかると、2進数や8進数にも応用できます。 Pythonの数値変換が一気に見通しよくなります。
baseは何進数かを指定する引数¶
int関数は、文字列とbaseを受け取って整数に変換できます。 baseに2を指定すれば2進数、8を指定すれば8進数、16を指定すれば16進数として読みます。
print(int("1010", 2))
print(int("12", 8))
print(int("10", 16))
このコードは、すべて10を出力します。 表記は違っても、表している値が同じだからです。
ここが数値表現のおもしろいところです。 数字の見た目が違っても、コンピューター内部で扱う値としては同じになることがあります。
baseに0を指定すると接頭辞から自動判定できる¶
int関数では、baseに0を指定することもできます。 この場合、0xや0bなどの接頭辞を見て、何進数かを自動で判断してくれます。
print(int("0b1010", 0))
print(int("0o12", 0))
print(int("0x10", 0))
このコードは、10、10、16を出力します。 0bは2進数、0oは8進数、0xは16進数を表します。
ただし、初心者のうちはint(hex_text, 16)のように明示的に書くほうがおすすめです。 読む人に意図が伝わりやすいからです。
16進数変換を使うときの実務的な注意点¶
コードとしては1行で書ける変換でも、実務では入力値の状態や表示形式を考える必要があります。 特に、外部から来るデータをそのまま信じすぎるとバグにつながります。
ここでは現場で意識しているポイントを紹介します。
入力値は文字列なのか数値なのかを確認する¶
16進数を扱うとき、入力値が文字列なのか数値なのかをまず確認しましょう。 "0x10"は文字列ですが、0x10はPythonの数値リテラルです。
text_value = "0x10"
number_value = 0x10
print(type(text_value))
print(type(number_value))
text_valueはstr型、number_valueはint型です。 見た目は似ていますが、型はまったく違います。
型を確認しないまま処理を書くと、思わぬエラーになることがあります。 特にAPIやCSVから読み込んだ値は文字列になっていることが多いので、変換処理を入れる場所を意識しましょう。
表示形式と内部の値を分けて考える¶
プログラムの内部では、10進数も16進数も最終的には整数として扱われます。 違うのは、人間にどう見せるかという表示形式です。
たとえば、次の2つは同じ値です。
a = 16
b = 0x10
print(a == b)
出力はTrueです。 16と0x10は見た目が違いますが、どちらも同じ整数値を表しています。
この考え方はとても大切です。 16進数は別の種類の数というより、同じ値を別の表記で見せているものだと捉えると理解しやすくなります。
0埋めが必要な場面を見落とさない¶
16進数に変換するとき、桁数をそろえる必要がある場面があります。 カラーコードやバイナリデータの表示では、1桁ではなく2桁で表示したいことが多いです。
for number in [0, 1, 15, 16, 255]:
print(f"{number:02x}")
このコードは、00、01、0f、10、ffのように出力します。 2桁にそろえることで、データの区切りが見やすくなります。
私はログ出力で16進数を使うとき、桁数をそろえるかどうかを最初に確認します。 桁がそろっていないログは、人間が読むときにかなり見づらくなるからです。
Pythonで16進数と10進数を相互変換する便利なサンプル¶
ここからは、実際に使いやすいサンプルコードをいくつか紹介します。 学習用としても、ちょっとしたツール作成の土台としても使えます。
コピペして動かすだけでなく、値を変えながら試してみると理解が深まります。
16進数から10進数へ変換する小さなツール¶
まずは、入力された16進数を10進数に変換するコードです。 ユーザーが0x付きでも0xなしでも入力できるようにしています。
def convert_hex_to_decimal():
hex_text = input("16進数を入力してください: ")
try:
decimal_number = int(hex_text, 16)
print(f"10進数では {decimal_number} です")
except ValueError:
print("16進数として正しくありません")
convert_hex_to_decimal()
このコードでは、ValueErrorが発生したときにエラーメッセージを出しています。 初心者向けのツールでも、エラー処理があるだけで使いやすさが大きく変わります。
実務でも、ユーザーが必ず正しい値を入力してくれるとは限りません。 だからこそ、変換できなかったときにどうするかを決めておくことが重要です。
10進数から16進数へ変換する小さなツール¶
次は、10進数を入力して16進数に変換するコードです。 入力は文字列として受け取るので、まずint関数で10進数の整数に変換しています。
def convert_decimal_to_hex():
decimal_text = input("10進数を入力してください: ")
try:
number = int(decimal_text)
print(f"16進数では {number:x} です")
print(f"0x付きでは {number:#x} です")
except ValueError:
print("10進数として正しくありません")
convert_decimal_to_hex()
ここで使っている#xは、0x付きの16進数として表示する書式です。 formatやf-stringでは、こうした細かい表示指定ができます。
最初は難しく感じるかもしれません。 ただ、表示形式を整えたい場面ではかなり便利です。
リスト内の16進数をまとめて10進数に変換する¶
複数の16進数をまとめて変換したいこともあります。 その場合は、for文やリスト内包表記を使うと便利です。
hex_values = ["0x10", "0x1f", "ff", "80"]
decimal_values = [int(value, 16) for value in hex_values]
print(decimal_values)
出力は[16, 31, 255, 128]です。 短く書けますが、初心者の方はまずfor文で書いても大丈夫です。
hex_values = ["0x10", "0x1f", "ff", "80"]
decimal_values = []
for value in hex_values:
decimal_values.append(int(value, 16))
print(decimal_values)
読みやすさを優先するなら、最初はfor文のほうが理解しやすいかもしれません。 慣れてきたらリスト内包表記にも挑戦してみましょう。
16進数変換を学ぶとPythonの理解が深まる理由¶
16進数の変換は、一見すると細かいテクニックに見えます。 しかし、実はPythonの数値、文字列、型変換、エラー処理をまとめて学べる良い題材です。
小さなテーマですが、学べることは多いです。 ここを理解すると、他の変換処理にも応用できます。
文字列と数値の違いを体感できる¶
int("1f", 16)では、文字列を整数に変換しています。 hex(31)では、整数を文字列に変換しています。
つまり、16進数変換を学ぶと、文字列と数値の違いを自然に意識するようになります。 これはPython学習でとても大切な感覚です。
初心者のうちは、見た目が数字なら全部同じに見えることがあります。 でも、Pythonでは"123"と123は別物です。
表示と値を分けて考えられるようになる¶
16進数を学ぶと、値そのものと表示方法は違うという考え方が身につきます。 これは、プログラミング全体でかなり重要です。
たとえば、日付も内部では別の形式で管理され、画面には2026-05-23のように表示されます。 金額も内部では数値として扱い、画面ではカンマ付きで表示することがあります。
16進数も同じです。 内部の値は整数で、表示するときに10進数や16進数として見せているだけです。
デバッグの視野が広がる¶
エラーコードやバイナリデータを見るとき、16進数が読めるとデバッグが楽になります。 これは実務で本当に効きます。
私も経験がありますが、ログに0xで始まる値が出ているだけで、初心者のころは少し怖く感じました。 でも、int関数で変換できるとわかってからは、ただの表記違いとして落ち着いて見られるようになりました。
知らない表記に出会ったときに、調べて変換して確認できる。 この姿勢は、エンジニアとしてかなり大切です。
まとめ¶
Pythonで16進数と10進数を変換する基本は、とてもシンプルです。 16進数から10進数にしたいならint(文字列, 16)、10進数から16進数にしたいならhex関数やformat、f-stringを使います。
最初は0xやaからfの表記に戸惑うかもしれません。 でも、ひとつずつ試していけば、そこまで難しいものではありません。
特に覚えておきたいのは、次の考え方です。
| 変換したい内容 | おすすめの書き方 |
|---|---|
| 16進数文字列から10進数 | int(hex_text, 16) |
| 10進数から0x付き16進数 | hex(number) |
| 10進数から0xなし16進数 | format(number, "x") または f"{number:x}" |
| 2桁の16進数にそろえる | f"{number:02x}" |
| 0x付きでf-string表示 | f"{number:#x}" |
16進数は、カラーコード、ログ、通信、バイナリデータなどでよく登場します。 つまり、学んでおくと実務で地味に助かる知識です。
エンジニア歴10年の私から見ると、こうした基礎変換をしっかり理解している人は、トラブル対応でも強いです。 表記に惑わされず、これは同じ値を別の形で見せているだけだと判断できるからです。
ここまでお読みいただきありがとうございました!