2014-10-18 64 views
0

我试图编码和解码C++中的Huffman编码。我不确定我的问题在哪里,我可以读写,但是当我解压缩文件时,它会乱码,所以我要么不能正确编码或解码。 我认为它是在我写作和阅读出现问题的文件时。所以这就是我必须编写的编码文件。首先,我都从我叫UMAP无序地图bitcodes存储到一个字符串:在C++中对Huffman编码进行一点一点的读写

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

这是使用调试器一个典型的例子。笔和纸也可能有帮助。这对于简单的代码审查看起来太复杂了。 – 2014-10-18 16:57:20

回答

0

该位被解压以相反的顺序来包装,这也许是因为你正在为每个使用不同的方法。首位打包进入位集的位0(位值< < 0)。解压后的第一位来自位7,因为setByte.to_string()在索引0处创建了位为7的字符串。该问题被标记为霍夫曼编码,但与它无关,它与比特流操作有关。

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; 
相关问题