-1

我对霍夫曼压缩进行了编码,它适用于所有扩展 ascii(0-255),但是当我打开像 mp3 这样的非文本文件时,里面有这样的想法:

ťîxł¸ H...W]`9M ČČ ˇ˘Ł¤Ąxw

它崩溃了。我测试过,这不是因为大小,而是因为输入数据。

它在文件保存时崩溃,代码如下:

for(int i=0;i<=contents.length();i++){
    newString +=kod[contents[i]];
}
saveFile("test_nowy.txt", newString);

bool saveFile (string name, string contents)
{
    ofstream file;
    file.open(name.c_str());
    file << contents;
    file.close();

}

我还需要说,尽管通过了所有早期步骤(计算代码等),但结果是错误的。看来我的程序不理解这些字符。

4

3 回答 3

6

您正在访问未定义行为的字符串的边界。

for(int i=0;i<=contents.length();i++)
             ^^

应该:

for(int i=0;i<contents.length();i++)
             ^^

顺便说一句,这将是学习调试器的好时机。捕获程序崩溃的确切点并找出原因。

于 2013-06-16T00:24:45.280 回答
2

您正在访问kod数组的负索引。尝试

kod[contents[i] & 0xFFu]

http://ideone.com/2LvmKW

还修复了 billz 发现的超限。

于 2013-06-16T00:50:35.797 回答
0

您说它适用于 0..255 的所有字符,但不适用于这些字符,这意味着您使用的不是 8 位字符。如果是这样,您的索引可能超出了 kod 的范围。

于 2013-06-16T00:34:10.310 回答