A continuación explicaremos cómo manejar strings y bytes en Python 3.
Fuente de casi todo este material
El tipo str
en Python 3 representa una cadena de texto inmutable.
print
Un objeto de tipo str
suele ser mostrado entre comillas cuando se le hace print
.
"esto es un objeto de tipo str"
str
Un str
se puede declarar con:
'hola mundo'
"hola mundo"
'''
texto
multi
línea
'''
str
en bytesPara transformar un objeto de tipo str
con encoding UTF-8
en un objeto de tipo bytes
, hay que ejecutar el método encode()
:
byte_str = "hola mundo".encode()
# byte_str = b'hola mundo'
str
Los caracteres de un objeto str
son inmutables. Lo que sí se puede hacer es crear un nuevo objeto que concatene las partes del str
que queremos con el nuevo valor:
palabra = "casa"
# si queremos cambiar el byte 3 a otro valor solo nos queda hacer esto:
palabra = palabra[:2] + "r" + palabra[3:]
# Ahora palabra es "cara"
bytes
en PythonEl tipo bytes
en Python 3 representa un arreglo inmutable de bytes.
print
Un objeto de tipo bytes
es mostrado como un str
, pero con una b
antes de las comillas:
b"esto es un objeto de tipo bytes"
si el byte no es mostrable como un caracter, se muestra en representación binaria:
0x00
se representa como \x00
0x47
se representa como G
(El código en bytes del caracter G
es 0x47
).bytes
Un objeto de tipo bytes se crea con el constructor bytes(...)
, el cual puede recibir:
n
: Crea un arreglo de bytes de tamaño n
inicializado en bytes con valor \x00
: bytes(3) = b'\x00\x00\x00'
bytes([1,2,71]) = b'\x01\x02G'
También se puede declarar como un str
, anteponiendo una b
a las comillas usadas:
b'hola mundo'
b"hola mundo"
b'''hola mundo'''
bytes
en str
Para transformar bytes
en un str
con encoding utf-8
, usamos el método .decode()
:
b = bytes([72, 111, 108, 97])
b_str = b.decode()
# 'Hola'
si algún byte no representa un caracter en el encoding utf-8
(como muy probablemente ocurra con gran parte de los caracteres de un texto cifrado), la función lanzará una excepción.
bytes
Al igual que en el caso de str
, los caracteres de bytes no son directamente modificables. Una solución es usar el mismo truco que en el caso str
:
b = b'\x01\x02\x00\x04'
# si queremos cambiar el byte 3 a otro valor solo nos queda hacer esto:
b = b[:2] + b'\x03' + b[3:]
# Ahora b es b'\x01\x02\x03\x04'
La otra alternativa que podemos usar es crear un objeto de tipo bytearray
a partir del objeto de tipo bytes. La próxima sección da más detalles de los objetos de tipo bytearray
.
Un hexstring
no es mas que un objeto de tipo str
que intenta representar datos en hexadecimal. El objeto sin embargo es de tipo str
posee las mismas propiedades que cualquier otro str
, salvo que para estar bien formado además debe:
a
, b
, c
, d
, e
, f
Para transformar un hexstring a un objeto de tipo bytes, usamos esta función:
b = bytes.fromhex("486f6c61")
# b será b'\x48\x6f\x6c\x61', o mejor dicho, b'Hola'
bytearray
en PythonEl tipo bytearray
en Python 3 representa un arreglo mutable de bytes, el cual se comporta prácticamente igual que el tipo bytes
, salvo que es posible mutar sus valores.
print
Un objeto de tipo bytearray
es mostrado como un bytes
, pero dentro de bytearray()
:
bytearray(b'esto es un objeto de tipo bytearray')
Al igual que en el caso de bytes
, si el byte no es mostrable como un caracter, se muestra en representación binaria:
0x00
se representa como \x00
0x47
se representa como G
(El código en bytes del caracter G
es 0x47
).bytearray
Un objeto de tipo bytes se crea con el constructor bytearray(...)
, el cual puede recibir:
bytearray()
n
: Crea un arreglo de bytes de tamaño n
inicializado en bytes con valor \x00
: bytearray(3) = bytearray(b'\x00\x00\x00')
bytearray([1,2,71]) = bytearray(b'\x01\x02G')
bytearray
en str
Para transformar bytes
en un str
con encoding utf-8
, usamos el método .decode()
:
b = bytearray([72, 111, 108, 97])
b_str = b.decode()
# 'Hola'
si algún byte no representa un caracter en el encoding utf-8
(como muy probablemente ocurra con gran parte de los caracteres de un texto cifrado), la función lanzará una excepción.
bytearray
Los caracteres del bytearray
se modifican como si de cualquier arreglo de Python se tratase, pero asignando números de entre 0 y 255 a las celdas:
b = bytearray(b'\x01\x02\x00\x04')
# si queremos cambiar el byte 3 a otro valor solo nos queda hacer esto:
b[2] = 20 # equivale a \x14 en decimal
# Ahora b es bytearray(b'\x01\x02\x14\x04')
Para transformar un hexstring a un objeto de tipo bytearray
, usamos esta función:
b = bytearray.fromhex("486f6c61")
# b será bytearray(b'\x48\x6f\x6c\x61'), o mejor dicho, bytearray(b'Hola')