Come un software di compressione dati legge un file come file binario puro e rende l'output?
-
29-09-2020 - |
Domanda
Ho una tecnica di compressione ibrida che voglio implementare, la mia implementazione è (finora): posso codificare una stringa in una stringa compressa codificata.Queste sono stringhe binarie.Ad esempio,
Leggi i testi da un file di testo ->
Quindi convertirlo in una stringa binaria ->
Quindi convertirlo in una stringa binaria codificata.
A questo punto, posso salvare la stringa binaria codificata in un file di testo, ma voglio sapere cosa è fatto in generale.
Ad esempio, quando usiamo WinRAR software, IT -
- .
- non legge come ho detto sopra, comprime qualsiasi file
- rende il file .rar come output
Allora, come un compressore "Leggi" qualsiasi file come forma binaria pura e come rende il file di output?
In un altro modo, quello che voglio è sapere come leggere qualsiasi file come forma binaria pura e fare un file di output dato che ho uno schema di codifica e decodifica. Si prega di commentare qualsiasi cosa relativa alla domanda, sono nuovo all'argomento.
Soluzione
Un file è un flusso di byte
Sebbene il sistema operativo fornisca alcune campane e fischietti (come metadati o forks ), la maggior parte definisce un file come una sequenza di 0 o più Bytes .
Ogni byte nel file è un valore numerico da 0 a 255 (incluso). Non c'è niente di più ad esso.
Un formato di file è un modo per dare il significato ai byte in un file
Per un semplice esempio, potresti avere un file che rappresenta un'immagine in bianco e nero, in cui ogni byte è o 0 (pixel nero) o 1 (pixel bianco), una riga dopo un'altra. Forse i primi due byte codificano la larghezza dell'immagine come un numero a 16 bit e il secondo due byte codificano l'altezza come un numero a 16 bit.
Questo esempio è molto inefficiente, dal momento che ogni byte dei pixel non può mai utilizzare i possibili valori 2-255. Potresti voler leggere su Teoria delle informazioni.
"file di testo" è un formato di file
In un file di testo, ogni valore possibile 0-255 viene assegnato un significato, una lettera specifica, un numero, un simbolo o un carattere "effetto speciale" come la nuova riga. Una specie di. Parlando rigorosamente, in ASCII Codifica, valori solo 0-127 hanno un significato. Ci sono molte diverse codifiche di testo, anche se solo poche quelle comuni. In Unicode , i caratteri non sono sempre 1 byte di lunghezza.
Ma andiamo con ASCII. Se si memorizza "51A3" come testo, i valori di byte 53, 49, 97, 51 entreranno nel file, in quanto corrispondono a "5", "1", ecc.
Se si memorizza il valore esadecimale 0x51 e 0xa3 come bytes , quindi ci saranno semplicemente quei due byte (81, 163 in decimale). Quindi questa è metà del numero di byte. Tuttavia il file non è più un file di testo perché 163 non è definito in ASCII.
Altri formati di file richiedono software appositamente costruito
I file di testo sono popolari perché puoi aprirli in qualsiasi editor (Blocco note, nano). Come capisci, non sono molto efficienti dallo spazio.
Ma non è difficile scrivere il tuo software. Ecco un esempio.
#!/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()
.
Dopo aver eseguito il controllo della lunghezza del file è metà della lunghezza della stringa esagonale. Inoltre, impara a utilizzare uno strumento Hexdump per ispezionare il contenuto del file.
Python's Oggetti Bytes hanno un sacco di funzioni ma se usi l'idea di base sopra (Elenco degli intervalli nell'intervallo 0-255 -> Oggetto Bytes) e (ITORERE OVERE OGGETTO BYTE E OTTIENI INT IN RANGE 0-255) Quindi non è necessario dormire troppo nei dettagli.
Il software di compressione di tutti gli usi di solito non comprende i file che comprime
Quando si inserisce un file MP3 in uno zip o un raro, il software di compressione lo tratta come una sequenza di byte, nello stesso modo in cui tratterebbe un file JPEG o EXE o HTML.