Ich habe diese Zeichenfolge: Hello world !!
und ich möchte sie mit Python als drucken 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
.
hex()
funktioniert nur für ganze Zahlen.
Wie geht das?
python
string
hex
ordinal-indicator
Eduard Florinescu
quelle
quelle
str
oder Python 3bytestring
), da in 0… 255 keine eindeutige Umwandlung eines Zeichens in eine Ganzzahl erfolgt. Daher erfordern Zeichenketten (Python 2unicode
und Python 3str
) zunächst eine gewisse Codierung, bevor sie in dieses hexadezimale Format konvertiert werden können. Die Antwort von Aaron Hall veranschaulicht dies.Antworten:
Sie können Ihre Zeichenfolge in einen Int-Generator umwandeln, für jedes Element eine Hex-Formatierung anwenden und mit einem Trennzeichen interkalieren:
quelle
str
als Hex nicht wirklich sinnvoll ist. Sie drucken möchtenbytes
Objekt als hex (convertstr
zubytes
durch den Aufruf.encode()
).":".join("{:02x}".format(ord(c)) for c in 'løl')
Renditen'6c:f8:6c'
, während":".join("{:02x}".format(c) for c in 'løl'.encode())
die Darstellung korrekt utf-8 erzeugt'6c:c3:b8:6c'
.":".join("{:04x}".format(ord(c)) for c in s)
(Ersetzen02x
durch04x
durch Nullstellen jeder Zahl mit 4 Ziffern) verwendenquelle
h = binascii.hexlify(b"Hello world !!") to get hex string. b":".join(h[i:i+2] for i in range(0, len(h), 2))
einfügen':'
.LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
Für Python 2.x:
Der obige Code funktioniert nicht mit Python 3.x , für 3.x funktioniert der folgende Code:
quelle
Eine weitere Antwort in zwei Zeilen, die für manche möglicherweise leichter zu lesen ist und beim Debuggen von Zeilenumbrüchen oder anderen ungeraden Zeichen in einer Zeichenfolge hilfreich ist:
Für Python 2.7
Für Python 3.7 (nicht in allen Versionen von 3 getestet)
quelle
codecs.encode(<bytestring>, "hex")
funktioniert aber.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||
Einige Ergänzungen zu Fedor Gogolev antworten:
Erstens, wenn die Zeichenfolge Zeichen enthält, deren 'ASCII-Code' unter 10 liegt, werden sie nicht wie erforderlich angezeigt. In diesem Fall sollte das richtige Format sein
{:02x}
:Zweitens, wenn Ihre "Zeichenfolge" in Wirklichkeit eine "Byte-Zeichenfolge" ist - und da der Unterschied in Python 3 von Bedeutung ist -, bevorzugen Sie möglicherweise Folgendes:
Bitte beachten Sie, dass im obigen Code keine Konvertierung erforderlich ist, da ein Byte-Objekt als "unveränderliche Folge von Ganzzahlen im Bereich 0 <= x <256" definiert ist .
quelle
Die akzeptierte Antwort lautet:
kehrt zurück:
Die akzeptierte Antwort funktioniert nur, solange Sie Bytes (meistens ASCII-Zeichen) verwenden. Wenn Sie jedoch Unicode verwenden, z.
Sie müssen irgendwie in Bytes konvertieren.
Wenn Ihr Terminal diese Zeichen nicht akzeptiert, können Sie UTF-8 dekodieren oder die Namen verwenden (damit Sie den Code zusammen mit mir einfügen und ausführen können):
Also sehen wir das:
kehrt zurück
Ein schlechtes / unerwartetes Ergebnis - dies sind die Codepunkte , die zusammen die in Unicode angezeigten Grapheme des Unicode-Konsortiums ergeben, die Sprachen auf der ganzen Welt repräsentieren. Dies ist nicht , wie wir diese Informationen tatsächlich gespeichert werden, so dass es durch andere Quellen interpretiert werden kann, though.
Damit eine andere Quelle diese Daten verwenden kann, müssen wir normalerweise in UTF-8-Codierung konvertieren, um diese Zeichenfolge beispielsweise in Byte auf der Festplatte zu speichern oder in HTML zu veröffentlichen. Daher benötigen wir diese Codierung, um die Codepunkte in die Codeeinheiten von UTF-8 zu konvertieren - in Python 3
ord
wird sie nicht benötigt, dabytes
es sich um iterierbare Ganzzahlen handelt:Oder vielleicht eleganter mit den neuen F-Strings (nur in Python 3 verfügbar):
In Python 2, passieren
c
zuord
ersten, das heißtord(c)
- weitere Beispiele:quelle
Sie können
hexdump
's verwenden(anhängen,
.lower()
wenn Sie Kleinbuchstaben benötigen). Dies funktioniert sowohl für Python 2 als auch für Python.quelle
pip install -U hexdump --proxy http://proxy.address:port
sudo
mit zu verwendenpip
, was durcheinander gebracht hatpacman
...Mit der Map- und Lambda-Funktion kann eine Liste von Hex-Werten erstellt werden, die gedruckt (oder für andere Zwecke verwendet) werden können.
quelle
[hex(ord(c)) for c in s]
Dies kann auf folgende Arten erfolgen:
Die Ausgabe erfolgt in hexadezimaler Form wie folgt:
quelle
__future__
steht eine Standardbibliothek in neueren Versionen von Python 2 zur Verfügung, mit der Funktionen normalerweise nur in Python 3 abwärtskompatibel gemacht werden können. In dieser Antwort wird dieprint(text)
Funktion "Druckfunktion" abgerufen, die dieprint text
Syntax von Python 2 ersetzt. Weitere Informationen finden Sie in den Python-Dokumenten .Ein bisschen allgemeiner für diejenigen, die sich nicht für Python3 oder Doppelpunkte interessieren:
quelle
Verwendung
base64.b16encode
in Python2 (integriert)quelle
.decode()
?Nur zur Vereinfachung, sehr einfach.
quelle
Für etwas, das mehr Leistung bietet als
''.format()
, können Sie Folgendes verwenden:Entschuldigung, das könnte nicht schöner aussehen. Es
wäre schön, wenn man es einfach tun könnte
'%02x'%v
, aber das dauert nur int ...aber Sie werden mit Byte-Strings
b''
ohne die Logik zur Auswahl stecken bleibenord(v)
.quelle