0

我需要编写一个程序来使用 Huffman 算法压缩/解压缩 txt 文件

我已经写过了,它适用于字符数少于缓冲区大小的文件,但它不适用于字符数更多的文件。

我的问题是将压缩缓冲区与解压缩缓冲区接口。

因此,如果压缩写入的字节数(其中包含要通过树的 1 和 0)与解压缩读取的字节数不同,则它不起作用。例如,如果压缩的缓冲区写入 200,我需要解压的缓冲区恰好读取 200 个字节。

如果我将解压缩的大小设置为读取 200,则在某处压缩将写入 200,而其他时候则小于或大于 200。

您能否建议如何跟踪每次压缩写入的字节数并将其传输到解压缩部分?

4

2 回答 2

2

“跟踪”流结尾的常用方法是专门为此用途添加一个 N+1“EOF”符号。这样,您不需要维护任何“大小”计数器。

于 2011-12-12T09:04:53.487 回答
0

我没有使用任何缓冲区。在我的文件的标题中,我写下代码长度和代码本身。所以当我想解压缩我的文件时,首先我从我的头文件中读取代码长度和代码(你也可以在头文件中放入几个字节来检查文件的正确性:例如 XXY,所以如果文件不是以这些字节开头,它就损坏了)。在我阅读了我的代码长度和我的代码之后,是时候解码其余数据了。你可以这样解码:

int data=0,dataLength=0;
while (input.read((char*)&sign, sizeof sign)) {     
    data = (data << 8) + sign;
    dataLength += 8;
    for (int i=0; i<256; i++) {
        if (dataLengthFromHeader[i]==0)
            continue;
        if (dataLength>=dataLengthFromHeader[i] && codesFromHeader[i] == data >> (dataLength-dataLengthFromHeader[i])) {
            unsigned char code = i;
            izlaz.write((char*)&code, sizeof code);
            dataLength -= dataLengthFromHeader[i];
            data = data - (codesFromHeader[i] << dataLength);
            if (dataLength==0) break;
                i=0;
        }
    }
}
于 2011-12-11T03:34:03.180 回答