2010-12-20 30 views
20

Wie kann ich eine Zeichenfolge in ihren Byte-Wert konvertieren? Ich habe eine Zeichenfolge "hello" und ich möchte zu etwas wie "/x68..." ändern.Wie konvertiert man String in Byte-Arrays?

+2

Sie erkennen, dass sie alle nur Bits und Bytes auf die ist tiefste Ebene und dass die Zeichenfolgen "Hallo" und "x68 \ x65 \ x6C \ x6C \ x6F" identisch sind (es sei denn, Sie entziehen sich den Backslashes, anstatt sie für hexadezimale Escapes zu verwenden)? – delnan

+0

Ja, ich weiß. Ich möchte nur in ein Array in einem so niedrigen Level exportieren. – Martin

+1

Das macht keinen Sinn, was willst du eigentlich machen? (Dies ist nur ein Zwischenschritt, von dem Sie denken, dass Sie es tun müssen) – plundra

Antwort

31

Python 2.6 und höher haben einen bytearray Typ, der möglicherweise das ist, was Sie suchen. Im Gegensatz zu Zeichenfolgen ist es veränderbar, d. H. Sie können einzelne Bytes "an Ort und Stelle" ändern, anstatt eine ganz neue Zeichenfolge erstellen zu müssen. Es hat eine schöne Mischung aus den Funktionen von Listen und Streichern. Und es macht auch Ihre Absicht klar, dass Sie mit willkürlichen Bytes anstatt mit Text arbeiten.

+1

Zitat "Ich möchte alles, was in der Datei (String) ist in Byte-Array ändern." @ @ @ @@@@@@ kindalls Antwort tut genau das. +1 für bytearray() – easysid

+8

'liste (bytearray (" hallo "))' –

+5

Ich habe einige Geschwindigkeit Tests und 'list (Bytearray (" Hallo ")) ist schneller als' map (ord, "Hallo") ' –

12

Wenn Sie hexadezimale Zeichenfolgendarstellung erhalten möchten Sie tun können:

"hello".encode("hex") # '68656c6c6f' 

Und Ihre Referenz Darstellung gerecht zu werden (nehmen Sie es nicht ernst, denke, das ist nicht das, was Sie wirklich wollen) :

"".join(["/x%02x" % ord(c) for c in "hello"]) # '/x68/x65/x6c/x6c/x6f' 
27

Vielleicht möchten Sie diesen (Python 2):

Für einen String Unicode Dies würde Unicode-Codepunkten zurück:

>>> map(ord,u'Hello, 马克') 
[72, 101, 108, 108, 111, 44, 32, 39532, 20811] 

aber kodieren es Byte-Werte für die Codierung zu erhalten:

>>> map(ord,u'Hello, 马克'.encode('chinese')) 
[72, 101, 108, 108, 111, 44, 32, 194, 237, 191, 203] 
>>> map(ord,u'Hello, 马克'.encode('utf8')) 
[72, 101, 108, 108, 111, 44, 32, 233, 169, 172, 229, 133, 139] 
+0

Beachten Sie, dass dies nicht "Byte" -Werte für Nicht-ASCII-Zeichen zurückgibt, da ord etwas größer als 0xFF zurückgibt. – user100464

+0

@ user100464, nicht für eine Byte-Zeichenfolge, die das obige für Python 2 ist ('map' gibt keine Liste in Python 3 zurück). Ein Byte darf nicht über 0xFF liegen. Außerdem liegt Nicht-ASCII über 0x7F, nicht 0xFF :) –

Verwandte Themen