Per farti capire dove è l'errore vado a creare un file con un solo carattere:
max@studio:~/tmp/x> hexdump -C test1
00000000 61 0a |a.|
00000002
Qui puoi notare il carattere 'a' seguito da un Line Feed. Ora vado a comprimerlo e ottengo:
max@studio:~/tmp/x> hexdump -C test1.huf
00000000 00 03 0a 00 00 00 01 61 00 00 00 01 ff 00 00 00 |.......a........|
00000010 01 00 00 00 05 e0 |......|
00000016
I primi due bytes sono il numero di tabelle immesse e quì non ci siamo - dovrebbe essere 2 e non 3 -
Seguono 2 tabelle corrette + 1 tabella con un bel carattere 'FF' (fine file) -che ovviamente non centra niente-
Poi ci sono i tuoi
n_bit che sono maggiori di 1 per l'elemento indesiderato
(per patchare il codice di decodifica era sufficiente decrementare n_bit di 1)
Per correggere il problema nella codifica, devi modificare la tua funzione
conta_occorrenze per non inserire il 'FF'
void conta_occorrenze(int v[],ifstream &input)
{
unsigned char c;
while ((c=input.get())!=0xff)
v[c]++;
}
Verifichiamo ora la modifica sulla funzione di codifica...
max@studio:~/tmp/x> hexdump -C test1.huf
00000000 00 02 0a 00 00 00 01 61 00 00 00 01 00 00 00 02 |.......a........|
00000010 80 |.|
00000011
Questo è il tuo file huf modificato. Possiamo vedere che il numero delle tabelle è 2 ed è sparito 'FF'... proviamo la decodifica e controlliamo...
max@studio:~/tmp/x> ll test1*
-rw-r--r-- 1 max users 2 6 gen 22:51 test1
-rw-r--r-- 1 max users 17 8 gen 13:46 test1.huf
-rw-r--r-- 1 max users 2 8 gen 13:54 test1.out
max@studio:~/tmp/x>
max@studio:~/tmp/x> diff test1 test1.out
max@studio:~/tmp/x>
max@studio:~/tmp/x> hexdump -C test1.out
00000000 61 0a |a.|
00000002
Ora proviamo con un file + grande... utilizziamo un sorgente cpp ... comprimiamo e decomprimiamo
max@studio:~/tmp/x> ll a.cpp*
-rw-r--r-- 1 max users 18177 8 gen 13:46 a.cpp
-rw-r--r-- 1 max users 11077 8 gen 13:59 a.cpp.huf
-rw-r--r-- 1 max users 18177 8 gen 13:59 a.cpp.out
max@studio:~/tmp/x>
max@studio:~/tmp/x> diff a.cpp a.cpp.out
max@studio:~/tmp/x>
Passo e chiudo,
Max