2010-12-20 11 views
20

¿Cómo puedo convertir una cadena en su valor de byte? Tengo una cadena "hello" y quiero cambiar es algo así como "/x68...".Cómo convertir cadenas a matrices de bytes?

+2

Se dan cuenta de que todo es sólo bits y bytes en el nivel más bajo y que las cuerdas '" hello "' y '" \ x68 \ x65 \ x6C \ x6C \ x6F "' son idénticas (a menos que escape las barras diagonales inversas en lugar de usarlas para escapes hexadecimales). – delnan

+0

Sí, lo sé. Solo quiero exportar a una matriz en un nivel tan bajo. – Martin

+1

Esto no tiene sentido, ¿qué es lo que _actualmente_ quieres hacer? (Este es solo un paso intermedio que usted cree que debe hacer) – plundra

Respuesta

31

Python 2.6 y posterior tienen un tipo bytearray que puede ser lo que estás buscando. A diferencia de las cadenas, es mutable, es decir, puede cambiar los bytes individuales "en su lugar" en lugar de tener que crear una cadena entera nueva. Tiene una buena combinación de las características de listas y cadenas. Y también hace que tu intención sea clara, que trabajas con bytes arbitrarios en lugar de texto.

+1

quote "Quiero cambiar todo lo que está en el archivo (String) en la matriz de bytes." .. @ la respuesta de kindall hace exactamente eso. +1 para bytearray() – easysid

+8

'list (bytearray (" hello "))' –

+5

Hice algunas pruebas de velocidad y 'list (bytearray (" hello "))' es más rápido que 'map (ord," hello ")' –

12

Si desea obtener representación de cadena hexadecimal que podría hacer:

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

Y para cumplir con su representación de referencia (no lo tome en serio, supongo que esto es no lo que realmente quiere) :

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

Tal vez usted quiere esto (Python 2):

Para una cadena Unicode devolvería Unicode puntos de código:

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

pero codifican para obtener valores de bytes para la codificación:

>>> 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

Tenga en cuenta que esto no devolverá valores de "byte" para caracteres que no sean ASCII, ya que ord devolverá algo más grande que 0xFF. – user100464

+0

@ user100464, no para una cadena de bytes, que lo anterior es para Python 2 ('map' no devuelve una lista en Python 3). Un byte no puede estar por encima de 0xFF. Además, no ASCII está por encima de 0x7F, no 0xFF :) –

Cuestiones relacionadas