it-swarm.com.de

Zeichenfolge als Hex-Byte ausgeben?

Ich habe diese Zeichenfolge: Hello world !! und möchte sie mit Python als 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 drucken.

hex() funktioniert nur für ganze Zahlen. 

Wie geht das?

137

Sie können Ihren String in einen int-Generator umwandeln, die Hex-Formatierung für jedes Element anwenden und mit dem Trennzeichen interkalieren:

>>> 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
205
Fedor Gogolev
':'.join(x.encode('hex') for x in 'Hello World!')
155
Aesthete

Für Python 2.x:

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

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

':'.join(hex(ord(x))[2:] for x in 'Hello World!')
52
Kelvin Hu

Eine andere Antwort in zwei Zeilen, die möglicherweise einfacher zu lesen ist und beim Debuggen von Zeilenumbrüchen oder anderen ungeraden Zeichen in einer Zeichenfolge hilfreich ist:

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

Einige Ergänzungen zur Antwort von Fedor Gogolev:

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 {: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 Ihre "Zeichenfolge" in Wirklichkeit eine "Byte-Zeichenfolge" ist - und da der Unterschied in Python 3 von Bedeutung ist, könnten Sie Folgendes bevorzugen:

>>> 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 im obigen Code keine Konvertierung erforderlich ist, da a bytes objects definiert ist als "eine unveränderliche Folge von Ganzzahlen im Bereich 0 <= x <256".

19
Sylvain Leroux

Zeichenfolge als Hex-Byte ausgeben?

Die akzeptierte Antwort gibt an:

s = "Hello world !!"
":".join("{:02x}".format(ord(c)) for c in s)

kehrt zurück: 

'48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21'

Die akzeptierte Antwort funktioniert nur, solange Sie Bytes verwenden (meistens ASCII-Zeichen). Wenn Sie jedoch Unicode verwenden, z.

a_string = u"Привет мир!!" # "Prevyet mir, or "Hello World" in Russian.

Sie müssen irgendwie in Bytes konvertieren.

Wenn Ihr Terminal diese Zeichen nicht akzeptiert, können Sie von utf-8 dekodieren oder die Namen verwenden (damit Sie den Code einfügen und mit mir ausführen können):

a_string = (
    "\N{CYRILLIC CAPITAL LETTER PE}"
    "\N{CYRILLIC SMALL LETTER ER}"
    "\N{CYRILLIC SMALL LETTER I}"
    "\N{CYRILLIC SMALL LETTER VE}"
    "\N{CYRILLIC SMALL LETTER IE}"
    "\N{CYRILLIC SMALL LETTER TE}"
    "\N{SPACE}"
    "\N{CYRILLIC SMALL LETTER EM}"
    "\N{CYRILLIC SMALL LETTER I}"
    "\N{CYRILLIC SMALL LETTER ER}"
    "\N{EXCLAMATION MARK}"
    "\N{EXCLAMATION MARK}"
)

Also sehen wir das: 

":".join("{:02x}".format(ord(c)) for c in a_string)

kehrt zurück

'41f:440:438:432:435:442:20:43c:438:440:21:21'

ein schlechtes/unerwartetes Ergebnis - dies sind die Code-Punkte , die sich zu den Graphemen zusammenfügen die wir in Unicode sehen, vom Unicode-Konsortium -, das Sprachen auf der ganzen Welt repräsentiert. Dies ist nicht, wie wir diese Informationen tatsächlich speichern, sodass sie von anderen Quellen interpretiert werden können.

Um einer anderen Quelle die Verwendung dieser Daten zu erlauben, müssten wir normalerweise in die UTF-8-Kodierung konvertieren, beispielsweise um diese Zeichenfolge in Byte auf der Festplatte zu speichern oder in HTML zu veröffentlichen. Wir brauchen also diese Kodierung, um die Codepunkte in die code units von utf-8 - in Python 3 zu konvertieren, ord ist nicht erforderlich, da bytes von Integer-Werten iterierbar ist:

>>> ":".join("{:02x}".format(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 mit den neuen f-Strings (nur in Python 3 verfügbar):

>>> ":".join(f'{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'

Übergeben Sie in Python 2 zuerst c an ord, d. H. ord(c) - weitere Beispiele:

>>> ":".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'
>>> ":".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'
8
Aaron Hall

Sie können hexdump 's verwenden

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

(Fügen Sie .lower() hinzu, wenn Sie Kleinbuchstaben benötigen). Dies funktioniert sowohl für Python 2 als auch für 3.

7
Tobias Kienzler

Mit der Map- und Lambda-Funktion kann eine Liste von Hex-Werten erstellt werden, die gedruckt werden können (oder für andere Zwecke verwendet werden können).

>>> 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']
6
BrendanSimon

Dies kann auf folgende Arten geschehen:

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

Die Ausgabe davon wird wie folgt in Hex dargestellt:

0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x20 0x21 0x21 0x21

2
Ghansham

In Python 3:

":".join(c.encode().hex() for c in "Hello world !!")
# 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21

Dies ist der Antwort von @ Aesthete ähnlich.

1
pylang

Nur zur Bequemlichkeit, sehr einfach. 

def hexlify_byteString(byteString, delim="%"):
    ''' very simple way to hexlify a bytestring using delimiters '''
    retval = ""
    for intval in byteString:
        retval += ( '0123456789ABCDEF'[int(intval / 16)])
        retval += ( '0123456789ABCDEF'[int(intval % 16)])
        retval += delim
    return( retval[:-1])

hexlify_byteString(b'Hello World!', ":")
# Out[439]: '48:65:6C:6C:6F:20:57:6F:72:6C:64:21'
1
BerndSchmitt

Verwenden von base64.b16encode in python2 (das eingebaute)

>>> s = 'Hello world !!'
>>> h = base64.b16encode(s)
>>> ':'.join([h[i:i+2] for i in xrange(0, len(h), 2)]
'48:65:6C:6C:6F:20:77:6F:72:6C:64:20:21:21'
0
Shiplu Mokaddim