Mam ten ciąg: Hello world !!
i chcę go wydrukować za pomocą Pythona jako 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
.
hex()
działa tylko dla liczb całkowitych.
Jak można to zrobić?
python
string
hex
ordinal-indicator
Eduard Florinescu
źródło
źródło
str
lub Python 3bytestring
), ponieważ nie ma jednoznacznej transformacji znaku w liczbę całkowitą w 0… 255. Dlatego ciągi znaków (Python 2unicode
i Python 3str
) wymagają najpierw pewnego kodowania, zanim zostaną przekonwertowane na ten format szesnastkowy. Odpowiedź Aarona Halla jest tego przykładem.Odpowiedzi:
Możesz przekształcić swój ciąg w generator int, zastosować formatowanie szesnastkowe dla każdego elementu i interkalować z separatorem:
źródło
str
as hex nie ma sensu; będziesz chciał wydrukowaćbytes
obiekt jako hex (przekonwertowaćstr
nabytes
przez wywołanie.encode()
).":".join("{:02x}".format(ord(c)) for c in 'løl')
powrotów'6c:f8:6c'
, podczas gdy":".join("{:02x}".format(c) for c in 'løl'.encode())
produkuje prawidłowy UTF-8 reprezentacji'6c:c3:b8:6c'
.":".join("{:04x}".format(ord(c)) for c in s)
(zastępującego02x
z04x
zero-pad każdy numer będzie 4 cyfry), a nieWARNING: Calling str(pkt) on Python 3 makes no sense!
źródło
h = binascii.hexlify(b"Hello world !!") to get hex string. b":".join(h[i:i+2] for i in range(0, len(h), 2))
aby wstawić':'
po każdych dwóch cyfrach szesnastkowych.LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
W przypadku Pythona 2.x:
Powyższy kod nie będzie działał z Pythonem 3.x , dla 3.x będzie działał poniższy kod:
źródło
Kolejna odpowiedź w dwóch wierszach, która dla niektórych może być łatwiejsza do odczytania, i pomaga w debugowaniu podziałów wierszy lub innych dziwnych znaków w ciągu:
W przypadku Pythona 2.7
Dla Pythona 3.7 (nie testowane we wszystkich wydaniach 3)
źródło
codecs.encode(<bytestring>, "hex")
jednak działa.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()+"||")
; (out)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||
Kilka uzupełnień do odpowiedzi Fedora Gogolewa:
Po pierwsze, jeśli ciąg zawiera znaki, których „kod ASCII” jest mniejszy niż 10, nie będą one wyświetlane zgodnie z wymaganiami. W takim przypadku prawidłowy format powinien wyglądać następująco
{:02x}
:Po drugie, jeśli Twój „ciąg” jest w rzeczywistości „ciągiem bajtów” - a ponieważ różnica ma znaczenie w Pythonie 3 - możesz preferować następujące:
Należy pamiętać, że nie ma potrzeby konwersji w powyższym kodzie, ponieważ obiekty bajtów są zdefiniowane jako „niezmienna sekwencja liczb całkowitych z zakresu 0 <= x <256” .
źródło
Zaakceptowana odpowiedź daje:
zwroty:
Zaakceptowana odpowiedź działa tylko wtedy, gdy używasz bajtów (głównie znaków ascii). Ale jeśli używasz Unicode, np:
Musisz jakoś przekonwertować na bajty.
Jeśli twój terminal nie akceptuje tych znaków, możesz dekodować z UTF-8 lub użyć nazw (abyś mógł wkleić i uruchomić kod razem ze mną):
Więc widzimy, że:
zwroty
słaby / nieoczekiwany wynik - są to punkty kodowe, które razem tworzą grafemy, które widzimy w Unicode, pochodzące z Konsorcjum Unicode - reprezentujące języki na całym świecie. Nie jest to jednak sposób, w jaki faktycznie przechowujemy te informacje, aby mogły być interpretowane przez inne źródła.
Aby umożliwić innemu źródłu korzystanie z tych danych, zwykle musielibyśmy przekonwertować je na kodowanie UTF-8, na przykład, aby zapisać ten ciąg w bajtach na dysk lub opublikować w formacie html. Więc potrzebujemy tego kodowania, aby przekonwertować punkty kodowe na jednostki kodu UTF-8 - w Pythonie 3,
ord
nie jest potrzebne, ponieważbytes
są iterowalne liczb całkowitych:A może bardziej elegancko, używając nowych f-stringów (dostępnych tylko w Pythonie 3):
W Pythonie 2 przejdź
c
doord
pierwszego, czyliord(c)
- więcej przykładów:źródło
Możesz użyć
hexdump
's(dołącz,
.lower()
jeśli potrzebujesz małych liter). Działa to zarówno w Pythonie 2, jak i 3.źródło
pip install -U hexdump --proxy http://proxy.address:port
sudo
zpip
, co pomieszałopacman
...Użycie mapy i funkcji lambda może wygenerować listę wartości szesnastkowych, które można wydrukować (lub wykorzystać do innych celów)
źródło
[hex(ord(c)) for c in s]
Można to zrobić na następujące sposoby:
Wynik tego będzie w postaci szesnastkowej w następujący sposób:
źródło
__future__
jest to standardowa biblioteka dostępna w najnowszych wersjach Pythona 2, która może być używana do normalnego tworzenia funkcji tylko w Pythonie 3 w celu zapewnienia zgodności wstecznej. W tej odpowiedzi jest używany do uzyskania funkcjiprint(text)
„print function”, która zastępujeprint text
składnię z Pythona 2. Zobacz dokumentację Pythona .Nieco bardziej ogólny dla tych, którzy nie dbają o Python3 lub dwukropki:
źródło
Używanie
base64.b16encode
w python2 (jego wbudowane)źródło
.decode()
?Dla wygody, bardzo proste.
źródło
w przypadku czegoś, co oferuje większą wydajność niż
''.format()
, możesz użyć tego:przepraszam, że to nie mogłoby wyglądać ładniej,
byłoby fajnie, gdyby można było po prostu to zrobić
'%02x'%v
, ale to wymaga tylko int ...ale utkniesz z ciągami bajtów
b''
bez logiki do wyboruord(v)
.źródło