Aiuto programma c++!! E' urgente!!! Grazie a tutti..

di il
46 risposte

46 Risposte - Pagina 3

  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Potresti spiegarmi meglio?
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    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
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Modificando la procedura conta occorrenze() nel modo in cui tu mi hai suggerito,ho problemi quando codifica file .doc di grandi dimensioni. In che punto del programma mi consigli di decrementare la variabile n_bit di 1?
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Il file doc è in ASCII? Sicuro?
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Come faccio ad allegarlo?così puoi visionare anke tu
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Ho progettato questo programma per comprimere file testo,audio,video e immagini!
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Ok...
    Sempre nella funzione conta_occorenze cicla x not eof e non 0xff
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Dici così:
    while(c=input.get())!=eof())
    {
    v[c]++;
    }
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    
    void conta_occorrenze(int v[],ifstream &input)
    {
        unsigned char c;
        while (input.good()) 
        {
            c = input.get();
            if (input.good())
              v[c]++;
        }
    }
    
    Nella funzione genera_decodifica sosituisci:
    
    
        ...
        while (input.good())
        {
            ch=input.get();
            if(ch=='255')
            exit(1);
            ...
            ...
        }
        ...
    
    con
    
        ...
        while (input.good())
        {
            ch=input.get();
            if(!input.good())
               return;
            ...
            ...
        }
        ...
    
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Sei stato gentilissimo!Ti ringrazio per l' aiuto!Quindi per il file che ti ho inviato inizialmente di piccole dimensioni nn posso fare nulla,nn ci sono modifiche che posso apportare per far si che il file compresso diventi in dimensione più piccolo dell' originale?GRAZIE ancora..
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Almeno 5 bytes li hai tolti no?!...

    Ciao,
    Max
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Quindi più di questo nn si può fare?
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Quello che frega è l'header ....per cui l'allocazione delle tabelle e compagnia bella.
    Bisognerebbe analizzare il file (molti zipper lo fanno) e cambiare tipologia di compressione.

    Immagina di avere un file binario con 255 caratteri differente, avrai 255x5=1275 bytes SOLO di tabelle... se anzichè usare 4 bytes di conteggio ne usi 2 (limitandoti a 65.535 riferimenti) risparmieresti mezzo k....

    Comprimere un file compresso con lo stesso algoritmo non dovrebbe dare miglioramenti, però forse unendolo ad altri algoritmi...chissà...

    ...e chiudiamo sto' topic!

    Con simpatia,
    Max
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Ok,ti ringrazio ancora per la disponibilità..
  • Re: Aiuto programma c++!! E' urgente!!! Grazie a tutti..

    Prego!

    Per concludere sarebbe interessante modificare l'header in questa forma:
    
    $$ -------------> Identificativo file compresso (2 byte)
    #.  -------------> numero tabelle (1 byte)
    tabella:
    $   -------------> carattere (1 byte)
    # (1 to n)------> lunghezza di capienza riferimenti (1 byte)
    # (1 to n) -----> riferimenti (byte variabili)
    ...         -----> prosegue al punto 'tabella' fino ad esaurimento tabelle
    
    Non so se è chiaro dovrei disegnare un tracciato record cartaceo

    Ora veramente chiudo il topic
Devi accedere o registrarti per scrivere nel forum
46 risposte