¿Cuál es la diferencia entre una cadena y una cadena de bytes?

Resuelto Sheldon asked hace 13 años • 9 respuestas

Estoy trabajando con una biblioteca que devuelve una "cadena de bytes" ( bytes) y necesito convertirla en una cadena.

¿Existe realmente una diferencia entre esas dos cosas? ¿Cómo se relacionan y cómo puedo realizar la conversión?

Sheldon avatar Jun 03 '11 14:06 Sheldon
Aceptado

Lo único que puede almacenar una computadora son bytes.

Para almacenar algo en una computadora, primero debes codificarlo , es decir, convertirlo a bytes. Por ejemplo:

  • Si desea almacenar música, primero debe codificarla usando MP3 , WAV , etc.
  • Si desea almacenar una imagen, primero debe codificarla usando PNG , JPEG , etc.
  • Si desea almacenar texto, primero debe codificarlo usando ASCII , UTF-8 , etc.

MP3, WAV, PNG, JPEG, ASCII y UTF-8 son ejemplos de codificaciones . Una codificación es un formato para representar audio, imágenes, texto, etc. en bytes.

En Python, una cadena de bytes es sólo eso: una secuencia de bytes. No es legible por humanos. En el fondo, todo debe convertirse en una cadena de bytes antes de poder almacenarse en una computadora.

Por otro lado, una cadena de caracteres, a menudo llamada simplemente "cadena", es una secuencia de caracteres. Es legible por humanos. Una cadena de caracteres no se puede almacenar directamente en una computadora; primero debe codificarse ( convertirse en una cadena de bytes). Existen múltiples codificaciones mediante las cuales una cadena de caracteres se puede convertir en una cadena de bytes, como ASCII y UTF-8.

'I am a string'.encode('ASCII')

El código Python anterior codificará la cadena 'Soy una cadena' usando la codificación ASCII. El resultado del código anterior será una cadena de bytes. Si lo imprime, Python lo representará como b'I am a string'. Recuerde, sin embargo, que las cadenas de bytes no son legibles por humanos , es solo que Python las decodifica desde ASCII cuando las imprime. En Python, una cadena de bytes se representa mediante un b, seguido de la representación ASCII de la cadena de bytes.

Una cadena de bytes se puede volver a decodificar en una cadena de caracteres, si conoce la codificación que se utilizó para codificarla.

b'I am a string'.decode('ASCII')

El código anterior devolverá la cadena original 'I am a string'.

La codificación y la decodificación son operaciones inversas. Todo debe codificarse antes de poder escribirse en el disco y debe decodificarse antes de que un humano pueda leerlo.

Zenadix avatar Jul 09 '2015 15:07 Zenadix

Suponiendo Python 3 (en Python 2, esta diferencia está un poco menos definida): una cadena es una secuencia de caracteres, es decir, puntos de código Unicode ; Estos son un concepto abstracto y no se pueden almacenar directamente en el disco. Una cadena de bytes es una secuencia de, como era de esperar, bytes: cosas que se pueden almacenar en el disco. El mapeo entre ellos es una codificación (hay bastantes de estos (y son posibles infinitos)) y necesita saber cuál se aplica en el caso particular para poder realizar la conversión, ya que una codificación diferente puede mapear los mismos bytes. a una cadena diferente:

>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'

Una vez que sepa cuál usar, puede usar el .decode()método de la cadena de bytes para obtener la cadena de caracteres correcta como se indica arriba. Para completar, el .encode()método de una cadena de caracteres va en sentido opuesto:

>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
lvc avatar Jun 03 '2011 07:06 lvc