intを16進文字列に変換する方法は?


210

整数(255以下)を16進数の文字列表現にしたい

例えば:私は渡したい65と出る'\x41'か、255および取得'\xff'

私はstruct.pack('c',65 )でこれを試してみました9が、単一の文字列を取り込みたいので、それは上記の何でも窒息します。

回答:


214

chr機能を探しています。

あなたは整数の10進表現と整数の16進表現を混合しているように見えるので、何が必要かは完全には明確ではありません。あなたが与えた説明に基づいて、私はこれらのスニペットの1つがあなたが望むものを示していると思います。

>>> chr(0x65) == '\x65'
True


>>> hex(65)
'0x41'
>>> chr(65) == '\x41'
True

これは、16進数として整数を含む文字列とはかなり異なることに注意してください。それが必要な場合は、hex組み込みを使用します。


2
chrは整数をASCIIに変換すると思いました。その場合、chr(65)= 'A'です。これは新しい追加ですか?
回死亡

2
@diedthreetimes chrは、ASCIIをまったく含みません。これは、単に数値を取り、バイトの序数値が数値である1バイトのバイト文字列を作成します。バイト文字列を書き込んで表示するときに、ASCIIおよびASCII互換のエンコーディングが機能します。
マイクグラハム、

1
@diedthreetimes、例えば、彼らは'A'を書いて表示する別の方法を作ることによってやって来ます'\x41'。すべてがstr本当に気にこれは六十から五であるという事実です。人間が物事を理解できると利用できるようにするには、それはしばしばA.なり
マイク・グラハム

134

これにより、整数が0xプレフィックス付きの2桁の16進数文字列に変換されます。

strHex = "0x%0.2X" % 255

2
ここでコードを編集して次のように変更することをお勧めします:strHex = "0x%0.2X"%integerVariable。(自分で編集することはできませんでした。)
Samuel



31

1桁の表現が必要な場合があるため、これを追加します。

'{:x}'.format(15)
> f

そして今f''あなたができる新しいフォーマット文字列で:

f'{15:x}'
> f

注:の最初の「f」f'{15:x}'はフォーマット文字列を示します


このきちんとした機能の参考として、PEP 498-リテラル文字列補間
MFT

1
私見、もう少し「読みやすい」オプションは '0x {:X}'。format(15)です(Xは大文字です)。2034の場合、7f2ではなく0x7F2を出力します
Pavel Sapehin

11

値が255未満の構造体(1バイトの符号なし、uint8_t)をパックして、1文字の文字列で終了する場合は、cではなくBという形式を探している可能性があります。Cは文字を文字列に変換します(単独ではあまり役に立ちません)が、Bは整数を変換します。

struct.pack('B', 65)

(はい、65は\ x65ではなく\ x41です。)

構造体クラスは、通信やその他の使用のためにエンディアンを便利に処理します。


struct.pack( 'B'、<integer>)を見つけるのにかかった時間は驚異的です。ありがとうございました。
Sean D.

7

大きな値でhex()も引き続き機能することに注意してください(他のいくつかの回答では機能しません)。

x = hex(349593196107334030177678842158399357)
print(x)

Python 2:0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

復号化されたRSAメッセージの場合、次のことを実行できます。

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3

5

これは私にとって最も効果的でした

"0x%02X" % 5  # => 0x05
"0x%02X" % 17 # => 0x11

幅の広い数値が必要な場合は(2)を変更します(2は2つの16進文字を表す)。3を指定すると、次のようになります。

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011

3

ランダムな整数を、先頭に#が付いた6桁の16進文字列に変換したかったのです。これを得るために私は使用しました

"#%6x" % random.randint(0xFFFFFF)

6
意味だと思う"#%6x" % random.randint(0x0, 0xFFFFFF)。(そこ欠落している%6randint2つのパラメータ-低級および上部bounds-かかります)
パシャ

5
スペースが不要な場合は%06xにする必要があります
Janus Troelsen

3

を使用するとformat()format-examplesに従って、次のことができます。

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

例えば:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'

1

また、任意の基数の任意の数値を16進数に変換できます。この1行のコードを使用すると、簡単で簡単に使用できます。

hex(int(n,x)).replace("0x","")

あなたnはあなたの数とx その数のベースである文字列を持っています。最初に、それを整数に変更し、次に16進数に変更しますが、16進数は0x最初にありますので、replace削除します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.