Como um software de compactação de dados lê um arquivo como um arquivo binário puro e produz a saída?

cs.stackexchange https://cs.stackexchange.com/questions/121856

Pergunta

Tenho uma técnica de compactação híbrida que quero implementar, minha implementação é (até agora):Posso codificar uma string em uma string compactada codificada.Estas são strings binárias.Por exemplo,

Eu li textos de um arquivo de texto ->

em seguida, converta-o em uma string binária ->

em seguida, converta-o em uma string binária codificada.

Neste ponto, posso salvar a string binária codificada em um arquivo de texto, mas quero saber o que é feito em geral.

Por exemplo, quando usamos Winrar software, ele -

  1. não lê como falei acima, comprime qualquer arquivo
  2. faz o arquivo .rar como saída

Então, como um compressor “lê” qualquer arquivo como uma forma binária pura e como ele cria o arquivo de saída?

De outra forma, o que eu quero é saber como ler qualquer arquivo como uma forma binária pura e criar um arquivo de saída, visto que tenho um esquema de codificação e decodificação. Por favor, comente qualquer coisa relacionada à pergunta, sou novo no assunto.

Foi útil?

Solução

Um arquivo é um fluxo de bytes

Embora os sistemas operacionais forneçam alguns recursos (como metadados ou garfos), a maioria define um arquivo como uma sequência de 0 ou mais bytes.

Cada byte no arquivo é um valor numérico de 0 a 255 (inclusive).Não há mais nada nisso.

Um formato de arquivo é uma forma de dar significado aos bytes em um arquivo

Para um exemplo simples, você poderia ter um arquivo representando uma imagem em preto e branco, onde cada byte é 0 (pixel preto) ou 1 (pixel branco), uma linha após a outra.Talvez os primeiros dois bytes codifiquem a largura da imagem como um número de 16 bits e os segundos dois bytes codifiquem a altura como um número de 16 bits.

Este exemplo é muito ineficiente, pois cada byte de pixel nunca pode usar os valores possíveis de 2 a 255.Você pode querer ler sobre teoria da informação.

"Arquivo de texto" é um formato de arquivo

Em um arquivo de texto, cada valor possível de 0 a 255 recebe um significado, uma letra, número, símbolo específico ou um caractere de "efeito especial", como nova linha.Tipo de.A rigor, no ASCII codificação, apenas os valores 0-127 têm significado.

Existem muitas codificações de texto diferentes, embora apenas algumas sejam comuns.Em Unicode, os caracteres nem sempre têm 1 byte de comprimento.

Mas vamos ficar com ASCII.Se você armazenar "51a3" como texto, os valores de bytes 53, 49, 97, 51 irão para o arquivo, pois correspondem a "5", "1", etc.

Se você armazenar o valor hexadecimal 0x51 e 0xa3 como bytes, então haverá simplesmente esses dois bytes (81, 163 em decimal). Portanto, isso é metade do número de bytes.No entanto, o arquivo não é mais um arquivo de texto porque 163 não está definido em ASCII.

Outros formatos de arquivo requerem software específico

Arquivos de texto são populares porque você pode abri-los em qualquer editor (Bloco de notas, nano).Como você entende, eles não são muito eficientes em termos de espaço.

Mas não é difícil escrever seu próprio software.Aqui está um exemplo.

#!/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()

Depois de executar esta verificação, o comprimento do arquivo é metade do comprimento da string hexadecimal.Além disso, aprenda a usar uma ferramenta hexdump para inspecionar o conteúdo do arquivo.

Python objetos de bytes tem muitos recursos, mas se você usar a ideia básica acima (lista de ints no intervalo 0-255 -> objeto bytes) e (iterar sobre o objeto bytes e obter um int no intervalo 0-255), então você não precisa aprofundar-se muito nos detalhes.

O software de compactação multifuncional geralmente não entende os arquivos que compacta

Quando você coloca um arquivo mp3 em um ZIP ou RAR, o software de compactação o trata como uma sequência de bytes, da mesma forma que trataria um arquivo JPEG, EXE ou HTML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a cs.stackexchange
scroll top