【问题标题】:How to Use Huffman code for compress file?如何使用霍夫曼代码压缩文件?
【发布时间】:2011-07-04 22:20:57
【问题描述】:

我的程序将霍夫曼代码存储在 char[8] 变量中。我想将它存储在 unsigned char 变量中。我这样做了,但认为它不能正常工作,因为当我使用以下代码提取文件时它不起作用:

unsigned char bit2byte ( unsigned char bits[8] ) {
    unsigned char x = 0; 

    for ( int k = 0; k < 8; k++ ) {
        if ( bits[k] == '1' ) 
            x = x | 1;

        x <<= 1; 
    }

    return x; 
}

【问题讨论】:

  • 是什么让您认为这不能正常工作?你的 byte2bit 函数在哪里?
  • 关于你要做什么真的有很多未知数,这个问题真的毫无意义

标签: c++ huffman-code


【解决方案1】:

这条线怎么样:

if ( bits[k] == '1' ) 

bits 数组是否将您的位存储为 ASCII 字符或数字值,即如果您尝试会发生什么

if ( bits[k] == 0x01 )

你可能会因为无法读懂你的想法而对我投反对票……

【讨论】:

    【解决方案2】:

    Huffman 是一种压缩方案,如果您想读取 Huffman 编码文件,您最可能希望对其进行解码(即解压缩)

    http://en.wikipedia.org/wiki/Huffman_coding

    在霍夫曼编码数据中,每个字符都表示为可变位数,因此您不能通过简单地传入文件的固定部分来处理文件,期望在每次调用中返回一个字节 - 您必须保持每次调用消耗了多少位,以及在位流中从何处开始处理以提取下一个字节的状态。

    要正确解码 Huffman 数据,您将需要编码树(参见 wikipedia 链接)——这棵树很可能也存储在文件中——所以实际上你的文件很可能有两个部分:(1)编码/解码树,以及 (2) 数据——在文件中的存储方式是特定于实现的,因此在尝试解码任何内容之前,您首先需要该规范。

    希望这会有所帮助。

    【讨论】:

    • 我的代码有点不同。我对我的列表进行排序并获取最少 2 个列表并将它们的总和添加到列表中并删除这 2 个节点,然后将它们添加到另一个列表中。对所有节点执行此操作。然后在list2中我读取2个第一个节点的重复然后搜索它的重复等于它们的节点并设置从2个节点到这个节点的链接。这使代码正确
    • 这是我的代码: void Huffman::coding(Huffman *n,Huffman *l){ Huffman *node;结构代码 mys;诠释 k=7;节点=n;无符号字符 x=0; while(node->repeat!=l->repeat){ mys.sCode[k]='0'+node->code; --k;节点=节点->pLink; } if(k字符; mys.baseCode=bit2byte(mys.sCode); body.push_back(mys); }
    • 我不确定我能否理解该代码的作用,也不清楚您是否尝试构建或使用 Huffman 树。我假设将“1”更改为 0x01 的其他答案对您没有帮助,因此您可能需要修改问题的描述,以包括您如何获得解码树,以及如何使用它来解码内容。
    【解决方案3】:

    我不清楚您所说的“不起作用”是什么意思,但您可能需要另辟蹊径。

    for (int k = 7; k >= 0; k--) {
    

    其他一切都和以前一样。

    当然,我也不知道你为什么用 8 个字节只存储 8 位信息。

    【讨论】:

    • 我使用了您的解决方案,但是 :(,我不明白您的意思是什么“我也不知道您为什么使用 8 个字节来仅存储 8 位信息。”
    • @zahrat unsigned char 是 8 位的。 @krasnerocalypse 说应该将这些位直接存储到一个 unsigned char 中,而不是将其分成 8 个。
    • 好吧,如果您可以将这个 unsigned char[8] 转换为单个 unsigned char 而不会丢失任何信息,为什么不一直使用 unsigned char?
    • 我真的不知道!我根据我的文件将此代码写入另一个文件以使其压缩。但是当我想提取它时,结果是错误的。所以 bit2byte 的结果是不正确的。我该怎么办!
    • 仔细看看。这确实是打包成一个字节。至于位顺序,这是约定俗成的问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多