Datos de Python del programador: bytes y cadenas

Índice de artículos
Datos de Python del programador: bytes y cadenas
Bytes como cadenas

Página 1 de 2

Existe una estrecha pero compleja relación entre bytes y cadenas. Aprende cómo funciona todo en este extracto de mi nuevo libro. Programador Python: todo son datos.

Python programador
Todo son datos

Ahora disponible como libro impreso: Amazonas

Contenido

  1. Python – Recorrido relámpago
  2. Tipo de dato básico – Números
    Extracto: número grande
  3. verdad y mentiras
  4. Fechas y Horarios
  5. Secuencias, Listas y Tuplas
  6. Instrumentos de cuerda
  7. Expresiones comunes
  8. Diccionario
  9. Iteradores, Conjuntos y Generadores
  10. Conceptos
    Extracto Conceptos
  11. Estructuras de datos y colecciones
  12. Manipulación de bits y bits
  13. Byte
    Extracto Bytes y cadenas ***¡¡¡NUEVO!!!
  14. archivos binarios
  15. archivos de texto
  16. Creación de clases de datos personalizadas
  17. Python y código nativo
    Apéndice I Python en Visual Studio Code
    Apéndice II C Programación usando Visual Studio Code

Ahora es el momento de ver la agrupación de bits para formar bytes. Python es inusual porque puede representar un patrón de bits de longitud arbitraria utilizando el tipo de datos bignum. La mayoría de los demás lenguajes tienen que generar patrones de bits más grandes utilizando muchas unidades más pequeñas, en la mayoría de los casos un byte, que son 8 bits. Python tiene varios objetos de datos que se pueden usar para trabajar con bytes, y la buena noticia es que la mayoría de ellos son secuencias, lo que los hace más complejos de lo que cabría esperar.

También existe una fuerte relación entre los objetos que funcionan en términos de bytes y cadenas. En particular, este capítulo es donde nos presentamos a la codificación y aprendemos a manejar protocolos más antiguos que funcionan en términos ASCII.

El segundo aspecto del manejo de bytes es tratar con búferes sin formato que otros programas y dispositivos pueden exponer a un programa de Python. Aquí es donde la vista de la memoria entra en juego.

Byte y Baytarray

Un bytearray es una matriz mutable de bytes. Un objeto byte es su contraparte inmutable. Ambos funcionan igual, excepto por cualquier operación que intente modificar el objeto de byte inmutable.

La forma en que funcionan los bytes y los bytearrays está determinada en gran medida por cómo funcionaban las cosas en los días del texto ASCII. Era común que los lenguajes de programación usaran cadenas para proporcionar matrices de valores de bytes. Cada carácter ASCII extendido en la cadena se usó para codificar un valor entre 0 y 255, es decir, un byte.

Entonces, por ejemplo, la cadena “Hello World” tiene una representación ASCII:

[‘0x48’, ‘0x65’, ‘0x6c’, ‘0x6c’, ‘0x6f’, ‘0x20’, ‘0x57’, ‘0x6f’,
‘0x72’, ‘0x6c’, ‘0x64’]

En otros idiomas, esta cadena se usaba como una matriz de bytes. En Python, las cadenas se almacenan mediante UTF-8, por lo que se pierde la simplicidad de un carácter por byte, lo que dificulta el uso de cadenas como matrices de bytes. El byte y la matriz de objetos de Python son esencialmente cadenas ASCII, por lo que puede continuar usándolos como matrices de bytes.

Esto explica la forma del literal de byte, que esencialmente agrega ab al comienzo del literal de cadena, lo que limita los caracteres que puede usar en la codificación ASCII. Por ejemplo, el literal de bytes para Hello World es:

myBytes = b"Hello World"

Esto crea un objeto de byte inicializado en los bytes especificados por los códigos ASCII de cada carácter en la cadena Hello World. El límite estricto de caracteres ASCII significa que el valor máximo que se puede especificar es 127. Si desea especificar un valor mayor que este, debe usar el código de escape y los bytes admiten el mismo conjunto que las cadenas. Especialmente relevante:

Un carácter con un valor octal de \ooo OOO

\xxh Un carácter con valor hexadecimal hh

Estos le permiten ir más allá de 127. Por ejemplo,

misBytes = b”\xFF\xFF”

crea un objeto myBytes con 255 almacenados en cada elemento.

Hay formas distintas de un byte literal para crear un byte inicial o un objeto de matriz de bytes. En cualquier caso, puede usar un constructor para convertir el iterador adecuado en un objeto de byte o de matriz de bytes. El formato es:

b = bytes(source)
b = bytearray(source)

donde fuente repetible Por supuesto, cada elemento debe estar entre 0 y 255, ya que esto también debe ser cierto para la fuente. Por ejemplo, byte([0xFF,0xAA,0x55]) crea un objeto de byte de tres elementos con los elementos que se muestran en la lista. Alternativamente, puede usar el método de clase fromhex, que le permite especificar valores hexadecimales usando una cadena:

bytesarray.fromhex(“FF AA 55”)

Si no está familiarizado con ASCII, o si las secuencias de bytes que desea se especifican como valores numéricos, esta es una forma más directa de crear bytes y secuencias de bytes. Sin embargo, no puede escapar completamente de la relación entre las cadenas ASCII y las matrices de bytes. Si imprime un objeto byte o bytearray, se imprime como una cadena ASCII, excepto para los elementos mayores que 127 y \hh, donde hh son caracteres hexadecimales. De manera similar, los caracteres ASCII que no se imprimen se muestran como secuencias de escape. Esto puede ser confuso. Por ejemplo:

imprimir(byte([0xFF,0xAA,0x55]))

muestra:

b’\xff\xaaU’

Los caracteres ASCII incrustados en una larga secuencia de códigos de escape son muy fáciles de perder.

Si está satisfecho con el hexadecimal y quiere ver los bytes en hexadecimal, que es más fácil de leer, puede usar el método de clase hexadecimal, que devuelve una cadena de valores hexadecimales:

print(bytes([0xFF,0xAA,0x55]).hex())

muestra:

ffaa55

No tiene código de escape, pero no delimita bytes. Puede especificar el carácter delimitador y cuántos dígitos hexadecimales agrupar utilizando dos parámetros en el método hexadecimal. Por ejemplo:

print(bytes([0xFF,0xAA,0x55]).hex(","))

muestra:

ff,aa,55

alternativamente, puede convertir a una lista y formatear el resultado según sea necesario.

Tenga en cuenta que puede crear un bytarray no utilizado:

b = bytearray(n)

donde n especifica el número de elementos.

Leave a Reply

Your email address will not be published. Required fields are marked *