Pregunta

Tengo una técnica de compresión híbrida que quiero implementar, mi implementación es (hasta ahora), puedo codificar una cadena en una cadena comprimida codificada.Estas son cadenas binarias.Por ejemplo,

Leí los textos de un archivo de texto ->

Luego convierte a una cadena binaria ->

Luego convierte a una cadena binaria codificada.

En este punto, puedo guardar la cadena binaria codificada en un archivo de texto, pero quiero saber qué se hace en general.

Por ejemplo, cuando usamos el software winrar , IT -

  1. no lees como dije anteriormente, comprime cualquier archivo
  2. hace que el archivo .rar como salida
  3. Entonces, ¿cómo un compresor "lee" cualquier archivo como un formulario binario puro y cómo hace el archivo de salida?

    De otra manera, lo que quiero es saber cómo leer cualquier archivo como un formulario binario puro y hacer un archivo de salida dado que tengo un esquema de codificación y decodificación. Por favor comente algo relacionado con la pregunta, soy nuevo en el tema.

¿Fue útil?

Solución

Un archivo es un flujo de bytes

Aunque los OSE proporcionan algunas campanas y silbidos (como metadatos, o Forks ), la mayoría define un archivo como una secuencia de 0 o más bytes .

Cada byte en el archivo es un valor numérico de 0 a 255 (inclusive). No hay nada más para eso.

Un formato de archivo es una forma de dar sentido a los bytes en un archivo

Para un ejemplo simple, podría tener un archivo que representa una imagen en blanco y negro, donde cada byte es 0 (píxel negro) o 1 (píxel blanco), una fila tras otra. Quizás los dos primeros bytes codifican el ancho de la imagen como un número de 16 bits, y los dos bytes de dos bytes codifican la altura como un número de 16 bits.

Este ejemplo es muy ineficiente, ya que cada byte de píxeles nunca puede usar los valores posibles 2-255. Es posible que desee leer sobre teoría de la información.

"archivo de texto" es un formato de archivo

En un archivo de texto, cada valor posible 0-255 tiene un significado, una letra, un número, un símbolo o un carácter de "efecto especial" como Newline. Algo así como. Estrictamente hablando, en la codificación ASCII , solo los valores 0-127 tienen un significado.

Hay muchas codificaciones de texto diferentes, aunque solo unos pocos comunes. En unicode , los caracteres no siempre son 1 byte de longitud.

Pero vamos a seguir con ASCII. Si almacena "51A3" como texto, los valores de byte 53, 49, 97, 51 entrarán en el archivo, ya que corresponden a "5", "1", etc.

Si almacena el valor hexadecimal 0x51 y 0xa3 como bytes , entonces simplemente habrá esos dos bytes (81, 163 en decimal). Así que esta es la mitad del número de bytes. Sin embargo, el archivo ya no es un archivo de texto porque 163 no está definido en ASCII.

Otros formatos de archivo requieren software construido en el propósito

Los archivos de texto son populares porque puede abrirlos en cualquier editor (Notepad, Nano). Como entiendes, no son muy eficientes en el espacio.

Pero no es difícil escribir su propio software. Aquí hay un ejemplo.

#!/usr/bin/env python3

# PART 1 - WRITE BYTES TO A FILE

save_hex = "60b725f10c9c85c70d97880dfe8191b3"

print("Saving:", save_hex)

# group save_hex into groups of 2
save_ints = []
i = 0
while i < len(save_hex):
    # the 16 makes int() treat the value as hex
    integer = int(save_hex[i:i+2], 16)
    save_ints.append(integer)
    i+=2

print("Integer values:", save_ints)

# create a bytes object out of an array of numbers
save_raw = bytes(save_ints)

with open('myfile.raw', 'wb') as f:
    f.write(save_raw)



# PART 2 - READ BYTES FROM A FILE

with open('myfile.raw', 'rb') as f:
    contents = f.read()

print("Loaded: ", end='')
for byte in contents:
    print('{:02x}'.format(byte), end='')
print()

Después de ejecutar esta verificación, la longitud del archivo es la mitad de la longitud de la cadena hexagonal. Además, aprenda a usar una herramienta Hexdump para inspeccionar los contenidos del archivo.

Python's Los objetos de bytes tienen muchas características, pero si usa la idea básica arriba (Lista de INT en el rango 0-255 -> Objeto de bytes) y (iteración sobre objeto de bytes y obtenga un INT en el rango 0-255), entonces no necesita ponerse demasiado en los detalles.

El software de compresión de todo uso generalmente no entiende los archivos que comprime

Cuando coloca un archivo MP3 en una ZIP o RAR, el software de compresión lo trata como una secuencia de bytes, de la misma manera que trataría un archivo JPEG o EXE o HTML.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a cs.stackexchange
scroll top