Crea e implementa una nuova codifica

1

Sto lavorando su un progetto con file enormi che contengono solo il set {[0-9] ,.}. La codifica in UTF-8 o ASCII crea file enormi.

Mi chiedo se potrei trovare un modo per codificare in soli 4 bit (rendi questi file 16 volte più piccoli). Avrei abbastanza di 16 caratteri!

Come posso procedere? Sto lavorando su Python e ho provato il seguente codice. Sembra che il computer non lo voglia, perché cancella solo ciò che era nel file di testo ...

def encodeData(self, filePath):
    print("File size before 4bits Encoding = {} Bits" .format(os.path.getsize(filePath)))
    print("Proceed with '{}' 4 bit Encoding... ".format(filePath))
    with open(filePath, "w+") as file2encode:
        for line in file2encode.readlines():
            for i in len(line):
                line[i] = 0x4
    print("File size After 4bits Encoding = {} Bits".format(os.path.getsize(filePath)))

C'è un modo per giocare con la codifica a 4 bit?

    
posta PyThagoras 14.11.2018 - 04:03
fonte

1 risposta

1

Prova a cercare reading-binary-file-and-looping- over-ciascun byte . Questo dovrebbe consentire di ottenere i byte.

Quindi dovrai mappare ogni personaggio che ti interessa in una rappresentazione a 4 bit. Gli operatori binari sono qui amici, qualcosa del tipo:

byteFirst = f.read(1);
byteSecond = f.read(1);

//assuming ascii/utf-8
encoded = ((byteFirst - 48) << 4) | ((byteSecond -48) << 4);

Avrai bisogno di racchiudere la logica di gestione degli errori attorno a questo, in particolare per la fine del file, un numero dispari di caratteri o qualsiasi altro carattere come la fine della riga, il ritorno a capo, lo spazio o altro carattere non numerico.

Per decodificare quanto sopra:

byteFirst = ((encoded >> 4) + 48);
byteSecond = ((encoded & 15) + 48);

Dovrai anche fare cast di tipo appropriato.

Potresti trovare più facile utilizzare gli schemi di compressione incorporati . Probabilmente otterrai un chilometraggio migliore in termini di dimensioni e non dovrai lavorare direttamente con i bit. D'altra parte, se hai bisogno di un archivio allineato con i record, potresti effettivamente volere un motore di database.

Il corto è che la manipolazione di bit è facile da sbagliare, il compilatore non si lamenterà se si ottiene la maschera sbagliata, o il numero di turni, o anche la dimensione del campo di bit sottostante. Non è male o non dovrebbe mai essere fatto - È ottimo per l'ottimizzazione della velocità / spazio - ma rende la comprensione di ciò che sta accadendo molto più difficile .

    
risposta data 14.11.2018 - 04:52
fonte

Leggi altre domande sui tag