es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python – representación de cadena de bytes en un archivo

Creo una cadena de bytes y la guardo en un archivo utilizando el siguiente código de Python:

bytes = b'1234567890'
file = open("bytes.txt", "wb")
file.write(bytes)

Luego abro el archivo utilizando “hexdump” y espero ver los bytes en la misma secuencia en la que estaban en la cadena de bytes, es decir:

3132 3334 3536 3738 3930

Pero el resultado es:

> hexdump bytes.txt
0000000 3231 3433 3635 3837 3039               
000000a

Los bytes están intercambiados entre sí, es decir, el primero con el segundo, el tercero con el cuarto, etc.

¿Por qué se guarda la cadena de bytes en este formato intercambiado?
¿Y cómo puedo hacer que Python guarde los bytes en el archivo exactamente de la misma manera en que están en la cadena?

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    La cadena de bytes se guarda en un formato intercambiado debido a la endianness de la arquitectura del sistema. La endianness se refiere a cómo se almacenan los valores de múltiples bytes en memoria. Hay dos tipos de endianness: big-endian y little-endian. En big-endian, el byte más significativo se guarda primero en la dirección de memoria más baja, mientras que en little-endian, el byte menos significativo se guarda primero en la dirección de memoria más baja. La cadena de bytes en la pregunta se guardó en little-endian porque es la endianness predeterminada de la arquitectura del sistema.

    Para hacer que Python guarde los bytes en el archivo de la misma manera en que están en la cadena, podemos usar el módulo struct para empaquetar la cadena de bytes en una endianness específica, ya sea big-endian o little-endian. Por ejemplo, para guardar la cadena de bytes en big-endian, podemos modificar el código de la siguiente manera:

    import struct
    
    bytes = b'1234567890'
    packed = struct.pack('>10s', bytes)
    with open("bytes.txt", "wb") as file:
        file.write(packed)
    

    En este código, utilizamos ‘>’, que significa big-endian, en el formato de empaquetado ‘>10s’ para empacar la cadena de bytes en formato big-endian.

Comments are closed.