Saya memiliki string ini: Hello world !!
dan saya ingin mencetaknya menggunakan Python as 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
.
hex()
hanya berfungsi untuk bilangan bulat.
Bagaimana itu bisa dilakukan?
python
string
hex
ordinal-indicator
Eduard Florinescu
sumber
sumber
str
atau Python 3bytestring
), karena tidak ada transformasi tegas karakter ke dalam integer di 0 ... 255. Dengan demikian, karakter string (Python 2unicode
dan Python 3str
) pertama-tama memerlukan beberapa pengkodean sebelum dapat dikonversi dalam format heksadesimal ini. Jawaban Aaron Hall mencontohkan ini.Jawaban:
Anda dapat mengubah string Anda menjadi generator int, menerapkan pemformatan hex untuk setiap elemen dan bersinggungan dengan pemisah:
sumber
str
sebagai hex tidak benar-benar masuk akal; Anda ingin mencetakbytes
objek sebagai hex (konversikanstr
kebytes
dengan menelepon.encode()
).":".join("{:02x}".format(ord(c)) for c in 'løl')
return'6c:f8:6c'
, sementara":".join("{:02x}".format(c) for c in 'løl'.encode())
menghasilkan representasi utf-8 yang benar'6c:c3:b8:6c'
.":".join("{:04x}".format(ord(c)) for c in s)
(ganti02x
dengan04x
ke-pad nol setiap angka menjadi 4 digit) sebagai gantinyaWARNING: Calling str(pkt) on Python 3 makes no sense!
sumber
h = binascii.hexlify(b"Hello world !!") to get hex string. b":".join(h[i:i+2] for i in range(0, len(h), 2))
untuk memasukkan':'
setelah setiap dua digit hex di dalamnya.LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
Untuk Python 2.x:
Kode di atas tidak akan berfungsi dengan Python 3.x , untuk 3.x, kode di bawah ini akan berfungsi:
sumber
Jawaban lain dalam dua baris yang sebagian mungkin lebih mudah dibaca, dan membantu dengan men-debug jeda baris atau karakter aneh lainnya dalam sebuah string:
Untuk Python 2.7
Untuk Python 3.7 (tidak diuji pada semua rilis 3)
sumber
codecs.encode(<bytestring>, "hex")
tidak bekerja.import sys
;s="Déjà vu Besançon,Lupiñén,Šiauliai,Großräschen,Łódź,Аша,广东省,LA"
;for c in s:
;w=sys.stdout.write(c+":"+c.encode('utf-8').hex()+"||")
; (keluar)D:44||é:c3a9||j:6a||à:c3a0|| :20||v:76||u:75|| :20||B:42||e:65||s:73||a:61||n:6e||ç:c3a7||o:6f||n:6e||,:2c||L:4c||u:75||p:70||i:69||ñ:c3b1||é:c3a9||n:6e||,:2c||Š:c5a0||i:69||a:61||u:75||l:6c||i:69||a:61||i:69||,:2c||G:47||r:72||o:6f||ß:c39f||r:72||ä:c3a4||s:73||c:63||h:68||e:65||n:6e||,:2c||Ł:c581||ó:c3b3||d:64||ź:c5ba||,:2c||А:d090||ш:d188||а:d0b0||,:2c||广:e5b9bf||东:e4b89c||省:e79c81||,:2c||L:4c||A:41||
Beberapa pelengkap jawaban Fedor Gogolev:
Pertama, jika string berisi karakter yang 'kode ASCII' di bawah 10, mereka tidak akan ditampilkan seperti yang diperlukan. Dalam hal itu, format yang benar adalah
{:02x}
:Kedua, jika "string" Anda sebenarnya adalah "byte string" - dan karena perbedaannya penting dalam Python 3 - Anda mungkin lebih suka yang berikut ini:
Harap perhatikan bahwa tidak perlu konversi dalam kode di atas karena objek byte didefinisikan sebagai "urutan bilangan bulat yang tidak dapat diubah dalam kisaran 0 <= x <256" .
sumber
Jawaban yang diterima memberi:
pengembalian:
Jawaban yang diterima hanya berfungsi selama Anda menggunakan byte (kebanyakan karakter ascii). Tetapi jika Anda menggunakan unicode, misal:
Anda perlu mengonversi ke byte entah bagaimana.
Jika terminal Anda tidak menerima karakter ini, Anda dapat mendekode dari UTF-8 atau menggunakan nama (sehingga Anda dapat menempel dan menjalankan kode bersama dengan saya):
Jadi kita melihat bahwa:
kembali
hasil yang buruk / tidak terduga - ini adalah poin kode yang bergabung untuk membuat grafik yang kita lihat di Unicode, dari Konsorsium Unicode - mewakili bahasa di seluruh dunia. Namun, ini bukan cara kami menyimpan informasi ini sehingga dapat ditafsirkan oleh sumber lain.
Untuk mengizinkan sumber lain menggunakan data ini, kita biasanya perlu mengonversi ke pengkodean UTF-8, misalnya, untuk menyimpan string ini dalam byte ke disk atau untuk mempublikasikan ke html. Jadi kita memerlukan pengkodean untuk mengonversi titik kode ke unit kode UTF-8 - dengan Python 3,
ord
tidak diperlukan karenabytes
iterables bilangan bulat:Atau mungkin lebih elegan, menggunakan f-string baru (hanya tersedia di Python 3):
Dalam Python 2, beralih
c
ke yangord
pertama, yaituord(c)
- lebih banyak contoh:sumber
Anda dapat menggunakan
hexdump
's(tambahkan
.lower()
jika Anda membutuhkan huruf kecil). Ini berfungsi baik untuk Python 2 & 3.sumber
pip install -U hexdump --proxy http://proxy.address:port
sudo
dengan menggunakanpip
, yang mengacaukanpacman
...Menggunakan fungsi peta dan lambda dapat menghasilkan daftar nilai hex, yang dapat dicetak (atau digunakan untuk tujuan lain)
sumber
[hex(ord(c)) for c in s]
Ini dapat dilakukan dengan cara-cara berikut:
Output dari ini adalah dalam hex sebagai berikut:
sumber
__future__
adalah pustaka standar yang tersedia dalam versi terbaru dari Python 2 yang dapat digunakan untuk membuat fitur-fitur yang biasanya hanya di Python 3 kompatibel dengan mundur. Dalam jawaban ini, ini digunakan untuk mendapatkan fiturprint(text)
"fungsi cetak", yang menggantikanprint text
sintaks dari Python 2. Lihat dokumen Python .Sedikit lebih umum bagi mereka yang tidak peduli tentang Python3 atau titik dua:
sumber
Menggunakan
base64.b16encode
di python2 ( bawaannya )sumber
.decode()
?Hanya untuk kenyamanan, sangat sederhana.
sumber
untuk sesuatu yang menawarkan lebih banyak kinerja daripada
''.format()
, Anda dapat menggunakan ini:maaf ini tidak bisa terlihat lebih bagus
akan lebih baik jika seseorang bisa melakukannya
'%02x'%v
, tetapi itu hanya membutuhkan int ...tetapi Anda akan terjebak dengan byte-string
b''
tanpa logika untuk memilihord(v)
.sumber