Como um software de compactação de dados lê um arquivo como um arquivo binário puro e produz a saída?
-
29-09-2020 - |
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 -
- não lê como falei acima, comprime qualquer arquivo
- 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.
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.