Esempio n. 1
0
//Om det är 1 i början av filen packas filen upp på samma sätt som förut
//Annars läses storleken på frekvenstbellen in först och sen byte för byte värden som sedan sätts in i frekvenstabellen
void decompress(ibitstream& input, ostream& output) {
    map<int, int> freqTable;
    int testForSize = input.get();
    if(testForSize == '1'){
        bool switchSide = false;
        string value = "";
        string freq = "";
        decompressHelper(input,freqTable,value,freq,switchSide);
    }else{
        int inputSize = input.get();
        for(int i = 0; i < inputSize; ++i){
            char tempByte = input.get();
            int tempValue = tempByte;
            int tempFreq = input.get();
            --inputSize;    //Eftersom både frekvensen samt karaktären tagits ut minska inputSize
            freqTable.insert(make_pair(tempValue,tempFreq));
        }
        //Eftersom "endoffile" karaktären inte lades till om vi inte hade tal större än en byte läggs den till här
        freqTable.insert(make_pair(PSEUDO_EOF,1));
    }
    HuffmanNode* encodingTree = buildEncodingTree(freqTable);
    decodeData(input,encodingTree,output);
    freeTree(encodingTree);
}
Esempio n. 2
0
void decodeDataHelper(ibitstream& input, HuffmanNode* encodingTree, ostream& output){
    //Noden är ett löv, skriv ut värdet
    if(encodingTree->isLeaf()){
        int character = encodingTree->character;
        if(character != PSEUDO_EOF){    //Om vi inte nått slutet
            output.put(encodingTree->character);
        }else{
            input.get();                //Ta bort sista tecknet
        }
    }else{
        //Läs in första biten
        int tempBit = input.readBit();
        //Traversera vänster/höger träd beroende på biten
        if(tempBit == 0){
            decodeDataHelper(input, encodingTree->zero, output);
        }else if(tempBit == 1){
            decodeDataHelper(input, encodingTree->one, output);
        }
    }
}