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.
printUn objeto de tipo str suele ser mostrado entre comillas cuando se le hace print.
"esto es un objeto de tipo str"
strUn 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'
strLos 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.
printUn objeto de tipo bytes es mostrado como un str, pero con una bantes 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 \x000x47 se representa como G (El código en bytes del caracter G es 0x47).bytesUn 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 strPara 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.
bytesAl 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, fPara 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.
printUn 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 \x000x47 se representa como G (El código en bytes del caracter G es 0x47).bytearrayUn 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 strPara 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.
bytearrayLos 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')