//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); }
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); } } }