2014-10-18 3 views
0

Я пытаюсь кодировать и декодировать кодировку Хаффмана на C++. Я не уверен, где моя проблема: я умею читать и писать, но когда я распаковываю файл, он скремблируется, поэтому я либо не кодирую, либо декодирую правильно. Я думаю, что когда я пишу и читаю файл, где все идет не так. Так вот что я должен написать закодированный файл. Сначала я хранить все bitcodes от моего неупорядоченный карты называется UMAP в одну строку:Чтение и запись по битам в C++ для кодировки Хаффмана

int i = 0, j = 0; 
string fullStr = ""; 
for (i = 0; i < buffsize; i++) //put all codes in one string of 1's and 0's 
    fullStr += uMap[buffer[i]]; 
unsigned char byte = 0; 
i = 0; 
for (j = 0; j < fullStr.length(); j++) 
{ 

    if (i != 8) 
    { 
     byte |= (fullStr[j] == '1') << i; // make up one byte 
     i++; 
    } 
    else 
    { 
     outf.put(byte); // write one byte at a time 
     byte = 0; 
     i = 0; 
    } 
} 
if (i != 0 && i < 8) 
{ 
    while (i<8) 
    { 
     byte |= 0 << i; // finish up last byte if not finished 
     i++; 
    } 
    outf.put(byte); 
} 

Тогда на стороне распаковывать:

int i = 0; 
unsigned char byte = 0; 
bitset<8> setByte; 
ofstream outf(filename, ofstream::binary); 
string concat = ""; 
string bitStr = ""; 
for (i = 0; i < buffLength; i++) 
{ 
    setByte = buffer[i]; 
    bitStr = setByte.to_string(); 
    for (int j = 0; j < 8; j++) 
    { 
     concat += bitStr[j]; 
     if (uMap[concat]) 
     { 
      //cout << "found code " << concat << " " << uMap[concat] << endl; 
      outf.put(uMap[concat]); 
      concat = ""; 
     } 
    } 
} 
outf.close(); 
+0

Это яркий пример использования отладчика. Ручка и бумага могут помочь. Это выглядит слишком сложно для простого обзора кода. –

ответ

0

Биты будут распакованы в обратном порядке упаковки, возможно, потому, что вы используете для каждого другой метод. Первый бит упакован в бит 0 битового набора (бит value < < 0). Первый бит распакован, начиная с бит 7, потому что setByte.to_string() создает строку с битом 7 с индексом 0. Вопрос был помечен как кодировка Хаффмана, но не имеет к этому никакого отношения, это касается манипуляции с битовыми потоками.

0

Благодарим вас за то, что вы были правы по поводу того, что прочитали, что они меняются, поэтому я позаботился об этом, но оказалось, что это было также то, как я тоже писал это.

Новый компресс:

int i = 0, j = 0; 
string fullStr = ""; 
for (i = 0; i < buffsize; i++) //put all codes in one string 
    fullStr += uMap[buffer[i]]; 
for (i = 0; i < fullStr.length(); i+=8) 
{ 
    unsigned char byte = 0; 
    string str8 = ""; 
    if (i + 8 < fullStr.length()) 
     str8 = fullStr.substr(i, i + 8); 
    else 
     str8 = fullStr.substr(i, fullStr.length()); 
    for (unsigned b = 0; b != 8; ++b) 
    { 
     if (b < str8.length()) 
      byte |= (str8[b] & 1) << b; // this line was wrong before 
     else 
      byte |= 1 << b; 
    } 
    outf.put(byte); 
} 
int filelen = outf.tellp(); 
outf.close(); 

Новая распаковка:

int i = 0,j=0,k=0; 
unsigned char byte = 0; 
bitset<8> setByte, reverseByte; 
ofstream outf(filename, ofstream::binary); 
string concat = ""; 
string bitStr = ""; 
string reverse = ""; 
int charCount = 0; 
for (i = 0; i < buffLength; i++) 
{ 
    setByte = buffer[i]; 
    bitStr = setByte.to_string(); 
    reverse = ""; 
    for (k = 7; k>=0; k--) 
     reverse += bitStr[k]; 
    for (j = 0; j < 8; j++) 
    { 
     concat += reverse[j]; 
     if (uMap[concat]) 
     { 
      outf << uMap[concat]; 
      charCount++; 
      concat = ""; 
      if (charCount == origLength) // if we have written original amount stop 
      { 
       outf.close(); 
       return 1; 
      } 

     } 
    } 
} 
outf.close(); 
return 1; 
Смежные вопросы