Esempio n. 1
0
void compress(istream& input, obitstream& output) {
	map<int, int> freqTable = buildFrequencyTable(input);
	HuffmanNode* encodingTree = buildEncodingTree(freqTable);
	map<int, string> encodingMap = buildEncodingMap(encodingTree);

    writeHeader(encodingTree, output);
    input.clear();
    input.seekg(0, ios::beg);

    encodeData(input, encodingMap, output);
    freeTree(encodingTree);
}
Esempio n. 2
0
//Komprimerar headern genom att se om det finns tal i frekvenstabellen som är större än en byte (255)
//Om så är fallet läggs den in i ouputen på samma sätt med en 1 först i filen för att markera det
//Annars sätts 0 först i filen samt storleken på frekvenstabellen, alla karaktärer och frekvenser
//Skrivs till ouput med .put()
//Exempel för example.txt 08322973983991 EOF lägg inte in eftersom den är större än en byte
void compress(istream& input, obitstream& output) {

    map<int, int> freqTable = buildFrequencyTable(input);
    HuffmanNode* priorityTree = buildEncodingTree(freqTable);
    map<int, string> encodingMap = buildEncodingMap(priorityTree);
    bool containsBiggerThanByte = false;
    vector<char> vectorForFreqTable;

    for(map<int,int>::iterator it = freqTable.begin(); it != freqTable.end(); ++it){
        if(it->first == PSEUDO_EOF){        //Lägg inte till PSEUDO_EOF än
            break;
        }
        else if(!(it->first > PSEUDO_EOF) && !(it->second > PSEUDO_EOF)){   //Om frekvensen och karaktären tar mindre än en byte
            vectorForFreqTable.push_back(it->first);
            vectorForFreqTable.push_back(it->second);
        }else{
            containsBiggerThanByte = true;
            break;
        }
    }
    if(containsBiggerThanByte){
        output.put('1');     //Tal större än en byte finns
        addBiggerThanByte(freqTable,output);

    }else{
        output.put('0');    //Inget tal större än en byte
        int freqTableSize = vectorForFreqTable.size();
        output.put(freqTableSize);  //tabellens storlek kommer användas för inmatningen
        for(int i = 0; i < freqTableSize; ++i){
            int tempNum = vectorForFreqTable.at(i);
            output.put(tempNum);
        }
    }
    input.clear();
    input.seekg(0, ios::beg);
    encodeData(input, encodingMap, output);
    freeTree(priorityTree);
}
Esempio n. 3
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);
}