新·bmp图像哈弗曼编码和解码源代码.docVIP

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HuffmanCode.h #ifndef CHUFFMAN #define CHUFFMAN 1 // 二叉树结点 struct SNode { unsigned long m_freq; // 频率 int m_len; // 深度,编码长度 SNode * m_pPar; // 父结点 SNode * m_pLeft; // 左结点 SNode * m_pRight; // 右结点 char * m_code; // 字节编码 SNode () { m_len = 0; m_freq = 0; m_code = 0; m_pPar = 0; m_pLeft = 0; m_pRight = 0; } }; // 哈夫曼编码类 (只为文件类型而写,对每个字节出现概率进行统计编码) // 编码使用方法,先Clear()清空。Add()将各字节加入,CreateCode()完成编码,使用GetCode()或AppendCode()获取编码 // 解码使用方法,先Clear()清空。CreateTree()创建编码,使用GetData()将编码转换为对应的字节 class CHuffmanCode { public: CHuffmanCode() {m_head = 0; Clear();} ~CHuffmanCode() {DestoryNode(m_head);} void Clear(); // 清空计数 int GetCodeNum() {return m_iCodeNum;} void Add(unsigned char n); // 将字节加入 void CreateCode(); // 编码 int GetCode(unsigned char n, char* buf, int len); // 获取编码,编码将以01的字符串形式返回,len缓冲区长度,返回编码长度 int GetCodeLen(unsigned char n); // 获取编码长度 // 将以01的字符串形式的编码循环写入buf,从rBegin位置开始写,len为缓冲区长度,超出长度则返回0位置开始写, // 函数执行完成后,rBegin指向下一待写入位置。返回编码长度 int AppendCode(unsigned char n, char* buf, int rBegin, int len); // 构建编码树,解码时用 // rNumber为目前开始解码的字节, buf循环缓冲,rBegin开始位置,end结束位置, len缓冲长度 void CreateTree(int rNumber, char* buf, int rBegin, int end, int len); // 获取字节, buf循环缓冲,rBegin开始位置,end结束位置, len缓冲长度, rData返回字节 // 长度不足未完成一次匹配,返回FALSE,成功返回TRUE bool GetData(char* buf, int rBegin, int end, int len, unsigned char rData); protected: int GetLen(char* buf, int begin, int len); // 从缓冲中读出8位并解析为长度 protected: void AddToList(SNode* pNode); // 将结点按顺序加入临时队列 void AddChildLen(SNode* pNode); // 增加结点儿子深度 void CreateCode(SNode* pNode); // 生成结点编码 void DestoryNode(SNode* pNode); // 销毁结点 protected: SNode m_code[256]; // 各字节编码 SNode* m_head; // 编码临时队列,指向第一位的指针 SNode* m_temp; // 临时指针,用于解码时,指向当前已走到的结点 int m_iCodeNum; // 已经编码的个数 int m_iRead; }; #endif #include stdafx.h #include string.h #include HuffmanCode.h // 清空计数 void CHuffmanCode::Clear() { DestoryNode(m_head); for (int i = 0; i 256; i++) { m_code[i].m_freq = 0; m_code[i].m_len = 0

文档评论(0)

xiaofei2001128 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档