[解決!Python]整数値(10進数値)を16進数表現に変換するには解決!Python

Pythonでは整数値(int型)の値を16進数表現に変換するには幾つかの方法がある。その中からhex関数を使う方法と文字列の書式指定を使って変換する方法を紹介する。

» 2024年03月05日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

n = 13345

# 16進数に変換
result = hex(n)  # 戻り値は文字列であることに注意
print(result)  # 0x3421
print(type(result))  # <class 'str'>

result = f'{n:x}'
print(result)  # 3421

result = f'{n:X}'  # 'X'でもよい
print(result)  # 3421

result = '{0:x}'.format(n)
print(result)  # 3421

result = '{:X}'.format(n)  # 'X'でもよい
print(result)  # 3421

result = format(n, 'x')
print(result)  # 3421

result = format(n, 'X'# 'X'でもよい
print(result)  # 3421

# 16進数であることを意味する'0x'を含めたい
result = f'{n:#x}'
print(result)  # 0x3421

result = f'{n:#X}'  # '0x'ではなく'0X'表記にする
print(result)  # 0X3421

# 最小文字数を指定したい
result = f'{n:#8x}'  # 最小文字数を指定
print(result)  #   0x3421

# 0埋めしたい
result = f'{n:0=#8x}'  # 0埋め
print(result)  # 0x003421

result = f'{n:#08x}'  # 上と同じ
print(result)  # 0x003421

result = f'{n:0>#8x}'  # 0埋めで右寄せ
print(result)  # 000x3421

# 符号の表記を指定したい
n = 13345

result = f'{n:+#8x}'  # 常に符号を含める
print(result)  #  +0x3421

result = f'{n:+#08x}'  # 常に符号を含め、符号の後を0埋め
print(result)  # +0x03421

n = 13345  # 正数

result = f'{n:-#08x}'  # 正数では符号を含めず、負数では符号を含める
print(result)  # 0x003421

n = -12345  # 負数
result = f'{n:-#08x}'
print(result)  # -0x03039

n = 13345  # 正数

result = f'{n: #08x}'  # 正数では符号の位置に空白文字を、負数では符号を含める
print(result)  #  0x03421

n = -12345  # 負数
result = f'{n: #08x}'
print(result)  # -0x03039

# 4桁ごとにアンダースコアを含めたい
n = 13345

result = f'{n:#09_x}'  # 4桁ごとにアンダースコアを含める
print(result)  # 0x00_3421

result = f'{n:#04_x}'  # widthオプションに4を指定して0埋め
print(result)  # 0x3421

n = 1193046
result = f'{n:#04_x}'
print(result)  # 0x12_3456


したいこと 方法
単純に変換したい hex関数を使う(戻り値は'0xXXXX'形式の文字列となる)。
文字列の書式指定でtypeオプションに’x’か'X'を指定
'0x'または'0X'を表示したい 文字列の書式指定で'#'を指定(大文字と小文字のどちらになるかはtypeオプションで'x'と'X'のどちらを指定したかによる)
最小文字数を指定したい 文字列の書式指定でwidthオプションに桁数を指定
先頭を0埋めしたい 文字列の書式指定でfillオプションに'0'/alignオプションに'='を指定
桁数を指定するwidthオプションに'0'を前置(両者は同じ効果となる)
符号の表記を指定したい 文字列の書式指定でsignオプションに以下を指定する
'+':常に符号を含める
'-':負数にのみ符号を含める
' ':正数では符号の代わりに空白文字を、負数では符号を含める
4桁ごとにアンダースコアを含めたい 文字列の書式指定でgrouping_optionに'_'を指定
10進数値を16進数表現に変換するときに指定可能な書式指定文字列のオプション

10進数値を16進数表現に変換する方法

 Pythonで10進数値(int型の整数値)を16進数表現に変換するには幾つかの方法がある。

  • hex関数を呼び出す(戻り値は文字列)
  • f文字列や文字列のformatメソッド、format関数で指定可能な書式指定文字列のformat_specフィールドのtypeオプションに'x'または'X'を指定する。以下に例を示す。

 一番簡単なのはhex関数を呼び出すことだ。以下に例を示す。

n = 13345

# 16進数に変換
result = hex(n)  # 戻り値は文字列であることに注意
print(result)  # 0x3421
print(type(result))  # <class 'str'>


 hex関数は整数値を受け取り、それを16進数として表現した文字列を返送する。先頭には16進数であることを意味する'0x'が前置され、その後に16進数表現が続く。ここでは13345という整数値を渡し、その16進数表現である'0x3421'という文字列を得ている。

 あるいはf文字列や文字列のformatメソッド、format関数の第2引数に指定可能な書式指定文字列のformat_specフィールドでtypeオプションに'x'または'X'を指定してもよい。以下に例を示す。

result = f'{n:x}'
print(result)  # 3421

result = f'{n:X}'  # 'X'でもよい
print(result)  # 3421


 これはf文字列を使った例だ(以下でもf文字列を例とする)。書式指定文字列の(置換フィールドにある)format_specフィールドのtypeオプションに'x'または'X'を指定している。その結果は16進数表現である'3421'のみだ。'x'と'X'の違いはformat_specフィールドに'#'を含めた場合に'0x'と'0X'のどちらが16進数表現の前に置かれるかにある。ただし、この例では'#'がないので同じ結果になっている。

 以下はformatメソッドを使用した例だ。

result = '{0:x}'.format(n)
print(result)  # 3421

result = '{:X}'.format(n)  # 'X'でもよい
print(result)  # 3421


 f文字列と同様だ。なお、formatメソッドでは置換フィールド(波かっこ「{}」で囲まれた部分)に番号や名前を付けられる。最初の例では番号として0を指定してtypeオプションに'x'を指定し、次の例では置換フィールドの番号や名前を省略しtypeオプションには'X'を指定している。

 最後にformat関数の例だ。

result = format(n, 'x')
print(result)  # 3421

result = format(n, 'X'# 'X'でもよい
print(result)  # 3421


 format関数では第1引数に変換したい値を、第2引数にformat_specフィールドに記述する書式指定を渡す。

 これらの例では戻り値は全て16進数表現のみとなっている。f文字列やformatメソッド、format関数のformat_specフィールドをで書式をより詳細に指定できる。

書式指定文字列のformat_specを使って変換する

 整数値を16進数表現に変換するには、書式指定文字列(のformat_specフィールド)の各種オプションを次のような形で指定する。

[[fill]align][sign]['#']['0'][width][grouping_option][type]


 これらは次のような意味を持つ(全て省略可。全てを省略した場合は単に、値が文字列化されるだけとなる)。

オプション 説明
fill 文字埋めする場合に使われる文字を指定
align widthオプションに指定した文字数内における変換後の値の文字寄せ(左寄せ:'<'、右寄せ:'>'、中央寄せ:'^'、符号の後を文字埋め:'=')
sign 常に符号を含める('+')、負数だけ符号を含める('-')、正数の場合は空白文字を負数の場合は符号を含める(' ')
'#' 2進数であることを意味する'0b'を含める
'0' widthオプションで指定した文字数内で0埋めすることを指定(fillオプションに'0'を、alignオプションに'='を指定したのと同様)
width 変換後の文字列の最小文字数を指定
grouping_option 4桁ごとにアンダースコアを含めるときにはここに'_'を指定
type 'b'を指定することで2進数表現に変換される
10進数値を16進数値に変換する際のformat_specの指定

 以下では目的別にこれらのオプションの指定方法を見ていく。

16進数であることを意味する'0x'または'0X'を含めたい

 hex関数が返す文字列のように16進数表現の前に'0x'や'0X'を置いて、それが16進数表現であることを明記したいときには'#'オプションを指定する。以下に例を示す。

result = f'{n:#x}'
print(result)  # 0x3421

result = f'{n:#X}'  # '0x'ではなく'0X'表記にする
print(result)  # 0X3421


 最初の例では'#x'のように'#'オプションに続けて、typeフィールドに小文字の'x'を指定している。このため、得られる文字列は'0x3421'のように先頭に'0x'が付けられている。次の例では'#X'と大文字を使用しているので'0X'と大文字になっている点に注目されたい。

最小文字数を指定したい

 変換後の16進数表現の最小文字数を指定するにはwidthオプションに文字数を指定する。以下に例を示す。

result = f'{n:#8x}'  # 最小文字数を指定
print(result)  #   0x3421


 この例では'#'オプションに続けてwidthオプションとして'8'を指定している。そのため、変換後の文字列は最低でも8文字となる。そのため、ここでは'0x3421'という6文字の前に空白文字が2つ置かれている。

0埋めしたい

 見た目をそろえるために、空白文字ではなく、0埋めの表現がほしいというときには、次のいずれかの方法を使うとよい。

  • fillオプションに'0'を、alignオプションに'='を指定する。以下に例を示す。
  • widthオプションの前に'0'を指定

 いずれを指定したときでも変換結果は同じだ。以下に例を示す。

result = f'{n:0=#8x}'  # 0埋め
print(result)  # 0x003421

result = f'{n:#08x}'  # 上と同じ
print(result)  # 0x003421


 fillオプションに'0'を、alignオプションに'>'を指定したときには「変換後の16進数表現は右寄せで、空いた部分を0埋め」を意味するので同じ結果が得られるような気がするが以下に示すように'0x'の前が0埋めされるので上の方法の方がよいだろう('0x'が必要ない、つまり'#'を指定しないのであればそのような指定でも問題ないと思われる)。

result = f'{n:0>#8x}'  # 0埋めで右寄せ
print(result)  # 000x3421


符号の表記方法を指定したい

 変換後の16進数表現における符号の表記を制御するにはsignオプションに以下を指定する。

  • '+':正数でも負数でも常に符号を含める
  • '-':正数では符号を含めず、負数にのみ符号を含める(デフォルト)
  • ' ':正数では符号の代わりに空白文字を含め、負数では符号を含める

 最初に'+'を指定したときの例を示す。

n = 13345

result = f'{n:+#8x}'  # 常に符号を含める
print(result)  #  +0x3421


 この例では'+#8x'(符号を常に表記、'0x'を含めて、最初文字数は8文字)を指定している。変換結果の'+0x3421'は7文字なので、その前に空白文字が1つ含められている点に注意。空白文字を含めるのではなく、0埋めしたいのであれば、上で紹介したように'#'の後、widthオプション(文字数)の前に'0'を置くなどしよう。

result = f'{n:+#08x}'  # 常に符号を含め、符号の後を0埋め
print(result)  # +0x03421


 この例では'+#08x'と最小文字数の指定'8'の前に'0'を置いたので、'+0x'の後が0埋めされている。

 次に'-'を指定した場合の例だ。これはsignオプションを指定しなかった場合のデフォルトの動作となる。

n = 13345  # 正数

result = f'{n:-#08x}'  # 正数では符号を含めず、負数では符号を含める
print(result)  # 0x003421

n = -12345  # 負数
result = f'{n:-#08x}'
print(result)  # -0x03039


 どちらの例でも'-#08x'(負数にのみ符号を含める、'0x'を含める、0埋めする、最小文字数は8文字)を指定している。そのため、正数を変換している最初の例では符号が含まれていない。一方、次の例では符号が含まれると同時に'-0x'の後が0埋めされている。

 最後に' 'を指定した例を示す。

n = 13345  # 正数

result = f'{n: #08x}'  # 正数では符号の位置に空白文字を、負数では符号を含める
print(result)  #  0x03421

n = -12345  # 負数
result = f'{n: #08x}'
print(result)  # -0x03039


 ここでも2つの例で' #08x'(正数では空白文字/負数では符号を含める、'0x'を含める、0埋め、最小文字数は8文字)を指定している。そのため、正数を変換している最初の例では符号があるはずの位置に空白文字が含められ、負数を変換している次の例では符号が含められている。

4桁ごとにアンダースコアを含めたい

 16進数表現では桁数が分かりにくいというときには4桁ごとにアンダースコアを含められる。これにはgrouping_optionオプションに'_'を指定する。以下に例を示す。

n = 13345

result = f'{n:#09_x}'  # 4桁ごとにアンダースコアを含める
print(result)  # 0x00_3421


 この例では'#09_x'('0x'を含める、最小文字数は9文字、アンダースコアを含める)を指定している。そのため、4桁ごとにアンダースコアを含んだ16進数表現が得られている。

 なお、変換後の16進数表現が最小文字数よりも大きな場合には、最小文字数は無視される。以下に例を示す。

result = f'{n:#04_x}'  # widthオプションに4を指定して0埋め
print(result)  # 0x3421


 この例では変換後の16進数表現が4桁で収まっているのでアンダースコアが含まれないが、桁数が4桁を超えたら、ちゃんとアンダースコアが含まれる。

n = 1193046
result = f'{n:#04_x}'
print(result)  # 0x12_3456


「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。