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.

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.


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

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:]

repr(chr(255)) # '\xff'juga mencapai ini
Glenn 'devalias'


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


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.


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

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

3

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

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

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'

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'

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.


-1

Sebagai representasi alternatif yang bisa Anda gunakan

[in] '%s' % hex(15)
[out]'0xf'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.