2012-08-31 12 views

Antwort

186

Sie können Ihren String in einen int-Generator-Transformation anwenden hex für jedes Element die Formatierung und einlagern mit Trennzeichen:

>>> s = "Hello world !!" 
>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 
+2

Großartig, es funktioniert in Python3, während Esthete's Antwort nicht funktioniert. –

+2

Beachten Sie, dass in python3 das Konzept, ein 'str' als hex zu drucken, nicht wirklich sinnvoll ist; Sie wollen das Byte-Objekt als hexadezimal ausgeben (konvertieren Sie 'str' in' bytes' durch Aufruf von '.encode()'). –

+5

Tatsächlich erzeugt dies eine ungültige Ausgabe in python3: '": ". Join (" {: 02x} ". Format (ord (c)) für c in 'løl')' returns ''6c: f8: 6c'' , während '": ". join (" {: 02x} ". format (c) für c in 'løl'.encode())' erzeugt die korrekte utf-8-Darstellung '' 6c: c3: b8: 6c'' . –

148
':'.join(x.encode('hex') for x in 'Hello World!') 
+1

Wie geht das in python3? –

+5

@hyh: 'h = binascii.hexlify (b" Hallo Welt !! "), um Hex-String zu erhalten. b ":". join (h [i: i + 2] für i im Bereich (0, len (h), 2)) '' '' nach jeweils zwei hexadezimalen Ziffern einzufügen. – jfs

49

Für Python 2.x:

':'.join(x.encode('hex') for x in 'Hello World!') 

Der Code oben wird nicht mit Python 3.x arbeiten, für 3.x wird der folgende Code funktionieren:

':'.join(hex(ord(x))[2:] for x in 'Hello World!') 
+1

es sollte auch beachtet werden, dass die spätere wird auch mit python2.x UND funktioniert auch für nicht-ASCII-Zeichen – raudi

+1

Aber auch beachten Sie, dass das letztere führende Nullen nicht auffüllen: hex (ord ("\ x00")) [2:] ist "0" und "\ x00" .encode ("hex") == "00" –

+2

Warum haben Sie sich entschieden, dies als neue Antwort zu veröffentlichen, Monate nachdem beide Lösungen von anderen Benutzern angeboten wurden ? Wenn es darum ging, die Kompatibilität der Versionen zu klären, wäre es sinnvoller, Änderungen an den vorhandenen Antworten vorzuschlagen. – Air

18

Einige Ergänzungen zu Fedor Gogolev Antwort:

Erstens, wenn die Zeichenfolge Zeichen, deren ‚ASCII-Code‘ enthält, ist unter 10, werden sie nicht als erforderlich angezeigt werden. In diesem Fall sollte das richtige Format {:02x} sein:

>>> s = "Hello unicode \u0005 !!" 
>>> ":".join("{0:x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:5:20:21:21' 
             ^

>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:05:20:21:21' 
              ^^ 

Zweitens, wenn Ihr „string“ in Wirklichkeit eine „Byte-String“ - und da die Differenz Angelegenheiten in Python 3 - Sie könnten es vorziehen, die folgende :

>>> s = b"Hello bytes \x05 !!" 
>>> ":".join("{:02x}".format(c) for c in s) 
'48:65:6c:6c:6f:20:62:79:74:65:73:20:05:20:21:21' 

Bitte beachten Sie, dass für die Umstellung keine Notwendigkeit, wie a bytes objects is defined als "eine unveränderliche Folge von ganzen Zahlen im Bereich von 0 < = x < 256" in dem obigen Code ist.

18

Eine andere Antwort in zwei Linien, die einige zu lesen finden könnte leichter und hilft bei der Fehlersuche Zeilenumbrüche oder andere ungerade Zeichen in einer Zeichenfolge:

for character in string: 
    print character, character.encode('hex') 
7

können Sie hexdump verwenden ‚s

import hexdump 
hexdump.dump("Hello World", sep=":") 

(fügen Sie .lower() hinzu, wenn Sie Kleinbuchstaben benötigen). Dies funktioniert für beide Python 2 & 3.

+0

Auch ein Problem, das ich lief, wenn Sie Probleme bei der Installation von Hexdump oder einem anderen Paket haben, ist es in der Regel wegen der Proxy-Einstellungen versuchen, rip mit der Proxy-Option 'pip install -U Hexdump - Proxy http: //proxy.address: port' –

+0

Eigentlich habe ich den Fehler gemacht, 'sudo' mit' pip' zu verwenden, was 'pacman' vermasselt hat ... –

7

Drucken Sie eine Zeichenfolge als Hexadezimalbyte?

Die akzeptierte Antwort gibt:

>>> s = "Hello world !!" 
>>> ":".join("{:02x}".format(ord(c)) for c in s) 
'48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 

Die akzeptierte Antwort funktioniert nur so lange, wie Sie zu ascii bleiben. Wenn Sie Unicode, zB:

>>> a_string = u"Привет мир!!" # "Prevyet mir, or "Hello World" in Russian. 
>>> ":".join("{:02x}".format(ord(c)) for c in a_string) 
'41f:440:438:432:435:442:20:43c:438:440:21:21' 

Wir bekommen ein schlechtes/unerwartetes Ergebnis - das sind die Codepunkte, die die Grapheme zu kombinieren, wir in Unicode zu sehen, die aus dem Unicode-Konsortium - darstellt Sprachen all über die Welt.Das ist nicht wie wir diese Information tatsächlich speichern, damit es von anderen Quellen interpretiert werden kann.

Um einer anderen Quelle die Verwendung dieser Daten zu ermöglichen, müssten wir normalerweise in die utf-8-Codierung konvertieren, um beispielsweise diese Zeichenfolge in Bytes auf Festplatte zu speichern oder in HTML zu veröffentlichen. Deshalb müssen wir, daß die Codierung der Codepunkte zu den Codeeinheiten von utf-8 konvertieren:

>>> ":".join("{:02x}".format(ord(c)) for c in a_string.encode('utf-8')) 
'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 

Oder vielleicht eleganter, benutzen Sie einfach die eingebaute format Funktion:

>>> ":".join(format(ord(c), '02x') for c in a_string.encode('utf-8')) 
'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 
4

Mit Karte und Lambda-Funktion kann eine Liste von hex-Werte erzeugen, die gedruckt werden können (oder für andere Zwecke verwendet)

>>> s = 'Hello 1 2 3 \x01\x02\x03 :)' 

>>> map(lambda c: hex(ord(c)), s) 
['0x48', '0x65', '0x6c', '0x6c', '0x6f', '0x20', '0x31', '0x20', '0x32', '0x20', '0x33', '0x20', '0x1', '0x2', '0x3', '0x20', '0x3a', '0x29'] 
1

Dies kann getan werden, in folgende Möglichkeiten:

from __future__ import print_function 
str = "Hello World !!" 
for char in str: 
    mm = int(char.encode('hex'), 16) 
    print(hex(mm), sep=':', end=' ') 

Der Ausgang dieses in hex sein wird, wie folgt:

0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x20 0x21 0x21

Verwandte Themen