【问题标题】:Huffman algorithm assembly霍夫曼算法组装
【发布时间】:2011-12-10 19:58:26
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 几天前,我做了同样的程序。你能多描述一下你的问题在哪里吗?
  • 当然,对于压缩,我使用 inbuffer (4000bytes) 来读取文件,
  • 读取文件后,我创建了频率表。将其写入输出。创建树。关闭并重新打开输入文件以再次读取以获取每个字母的路径,在输出文件中写入路径(0 向上 1 向下)我使用 3000 字节缓冲区。在每个 0 或 1 移入 8 位缓冲区后写入这些位。但是有些位是垃圾,所以我对它们进行计数,并将输出作为缓冲区的第一个字符写入,我从解压缩中读回。但问题是,压缩的输出缓冲区的大小应该始终与 decom 的 inbuffer 的大小相同
  • 但是,压缩输出缓冲区的大小并不总是 3000,因为有时它写入的字节数少于 3000,任何建议如何避免此问题,或任何其他如何获取压缩和解压缩并注意垃圾位?

标签: assembly compression huffman-code


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我没有使用任何缓冲区。在我的文件的标题中,我写下代码长度和代码本身。所以当我想解压我的文件时,首先我从我的头文件中读取代码长度和代码(你也可以在头文件中放几个字节来检查文件的正确性:例如 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;
            }
        }
    }
    

    【讨论】:

    • 非常感谢,但我在汇编中需要它,我不知道两者的输出文件是否相同
    • 使用编译器将其翻译成程序集
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多