Bagaimana cara mengubah int ke string hex?

210

Saya ingin mengambil bilangan bulat (yang akan menjadi <= 255), ke representasi string hex

misalnya: Saya ingin lulus 65dan keluar '\x41', atau 255dan masuk '\xff'.

Saya sudah mencoba melakukan ini dengan struct.pack('c',65 ), tetapi itu tersedak apa pun di atas 9karena ingin mengambil string karakter tunggal.

pynoob
sumber

Jawaban:

214

Anda sedang mencari chr fungsinya.

Anda tampaknya mencampur representasi desimal bilangan bulat dan representasi heksa bilangan bulat, sehingga tidak sepenuhnya jelas apa yang Anda butuhkan. Berdasarkan uraian yang Anda berikan, saya pikir salah satu cuplikan ini menunjukkan apa yang Anda inginkan.

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


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

Perhatikan bahwa ini sangat berbeda dari string yang berisi integer sebagai hex . Jika itu yang Anda inginkan, gunakan hexbuiltin.

Mike Graham
sumber
2
Saya pikir chr dikonversi bilangan bulat ke ascii. Dalam hal ini chr (65) = 'A'. Apakah ini tambahan baru?
diedthreetimes
2
@diedthreetimes, chrtidak melibatkan ASCII sama sekali - hanya membutuhkan angka dan membuat bytestring satu byte di mana nilai ordinal byte adalah angka. Pengkodean yang kompatibel dengan ASCII dan ASCII mulai berlaku saat Anda menulis dan menampilkan bytestrings.
Mike Graham
1
@diththreetimes, Misalnya, mereka masuk dengan membuat 'A'cara lain untuk menulis dan menampilkan '\x41'. Yang strbenar-benar peduli adalah kenyataan ini enam puluh lima. Untuk membuat hal-hal dapat dimengerti dan digunakan oleh manusia, sering kali menjadi A.
Mike Graham
135

Ini akan mengonversi bilangan bulat menjadi string hex 2 digit dengan awalan 0x:

strHex = "0x%0.2X" % 255
Greg Bray
sumber
2
Saya sarankan untuk mengedit kode di sini dan mengubahnya menjadi ini: strHex = "0x% 0.2X"% integerVariable. (Saya tidak dapat mengedit sendiri.)
Samuel
58

Bagaimana dengan hex()?

hex(255)  # 0xff

Jika Anda benar-benar ingin berada \di depan, Anda dapat melakukannya:

print '\\' + hex(255)[1:]
Felix Kling
sumber
repr(chr(255)) # '\xff'juga mencapai ini
Glenn 'devalias'
43

Mencoba:

"0x%x" % 255 # => 0xff

atau

"0x%X" % 255 # => 0xFF

Dokumentasi Python mengatakan: "simpan ini di bawah bantal Anda: http://docs.python.org/library/index.html "

Dawid
sumber
31

Izinkan saya menambahkan ini, karena kadang-kadang Anda hanya ingin representasi satu digit:

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

Dan sekarang dengan f''string format baru yang dapat Anda lakukan:

f'{15:x}'
> f

CATATAN: inisial 'f' f'{15:x}'adalah untuk menandakan string format

monkut
sumber
Untuk referensi pada fitur yang rapi ini, PEP 498 - Interpolasi String Literal
MFT
1
IMHO, opsi "terbaca" sedikit lebih bisa berupa format '0x {: X}' (15) (pemberitahuan X dalam huruf besar). Untuk 2034 itu akan mencetak 0x7F2 bukannya 7f2
Pavel Sapehin
11

Jika Anda ingin mengemas struct dengan nilai <255 (satu byte tidak ditandatangani, uint8_t) dan berakhir dengan string satu karakter, Anda mungkin mencari format B alih-alih c . C mengubah karakter menjadi string (tidak terlalu berguna dengan sendirinya) sementara B mengubah bilangan bulat.

struct.pack('B', 65)

(Dan ya, 65 adalah \ x41, bukan \ x65.)

Kelas struct juga akan dengan mudah menangani endianness untuk komunikasi atau penggunaan lainnya.

XTL
sumber
Jumlah waktu yang diperlukan untuk menemukan struct.pack ('B', <integer>) sangat mengejutkan. Terima kasih.
Sean D.
7

Perhatikan bahwa untuk nilai besar, hex()masih berfungsi (beberapa jawaban lain tidak):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

Untuk pesan RSA yang didekripsi, seseorang dapat melakukan hal berikut:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

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

Ini bekerja paling baik untuk saya

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

Ubah (2) jika Anda ingin nomor dengan lebar lebih besar (2 untuk 2 karakter hex printned) sehingga 3 akan memberi Anda yang berikut

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

Saya ingin integer acak dikonversi menjadi string hex enam digit dengan # di awal. Untuk mendapatkan ini saya gunakan

"#%6x" % random.randint(0xFFFFFF)
ncmathsadist
sumber
6
Saya kira maksud Anda "#%6x" % random.randint(0x0, 0xFFFFFF). (Ada yang hilang %sebelum 6dan randintmengambil 2 parameter -lebih rendah dan batas atas-)
pacha
5
harus% 06x jika Anda tidak ingin spasi
Janus Troelsen
3

Dengan format(), sesuai format-contoh , kita dapat melakukan:

>>> # 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'
Peta
sumber
2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Sebagai contoh:

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

Anda juga dapat mengonversi nomor apa pun di pangkalan apa pun menjadi hex. Gunakan kode satu baris ini di sini, mudah dan sederhana untuk digunakan:

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

Anda memiliki string nyang merupakan nomor Anda dan x pangkalan nomor itu. Pertama, ubah ke integer dan kemudian ke hex tetapi hex memiliki 0xpada awalnya jadi dengan replacekita menghapusnya.

Izak Sensei
sumber
-1

Sebagai representasi alternatif yang bisa Anda gunakan

[in] '%s' % hex(15)
[out]'0xf'
uzumaki
sumber