用C语言编写程序实现Zip或者Rar无损压缩算法

zip解压缩与压缩源码(无乱码) go不支持rar解包,这里调用windows命令,zip解包可直接复制使用 阅读详情

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*                                                                  *
*HUFF.C Huffman encode for multimedia application 8*8 pixel Ver 3  *
*                                                                  *
*Ver 1:  Complied in Borland Turbo C++ 3.0                         *
*Ver 2:  Complied in Microsoft Visual C++ 6.0                      *
*Ver 3:  Complied in Microsoft Visual C++ 6.0                      *
*          add code to print code table of the compression         *
*          print output message in Chinese                         *
*                                                                  *
*by Lee Meitz, Solid Mechanics, Huazhong Univ of Sci and Tech      *
*2001.11.15 - 2001.12.27                                           *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define  DNUM 64    //define data number 8*8
#define  LOOP 10000 //times of compression

typedef struct
{
    unsigned short weight, data;
    unsigned short parent, lchild, rchild;
} HuffNode;

typedef struct
{
    unsigned char code;
    unsigned short codelength;
} HuffCode;

unsigned int fCount[256] = {0};
unsigned int data_num;
unsigned int code_size;
unsigned int last_bit;
void FrequencyCount(unsigned char*);         //频率统计
void HuffSelect(HuffNode*, int, int*, int*); //从结点中选出权最小的两个节点
void HuffmanCodeTable(HuffNode*, HuffCode*); //构造huffman树,生成huffman编码表
void HuffmanCompress(unsigned char*, unsigned char *, HuffCode*); //压缩数据
void BitPrint(unsigned char*);               //按位打印结果,用于调试

void main()
{
    int i, j, loop;                               //variable for loop
    HuffNode hfdata[2*DNUM] = {{0, 0, 0, 0, 0}};  //Huffman node
    HuffCode code_table[256] = {{0, 0}};          //code table will be searched by subscript
    unsigned char hfcode[2*DNUM];                 //output code
    time_t time1, time2;
/*  unsigned char pixel[DNUM] = {
    1,2,3,4, 1,2,3,4, 1,2,3,4, 1,1,1,1};
*/
/*  unsigned char pixel[DNUM] = {
        139,144,149,153,155,155,155,155,
        144,151,153,156,159,156,156,156,
        150,155,160,163,158,156,156,156,
        159,161,162,160,160,159,159,159,
        159,160,161,162,162,155,155,155,
        161,161,161,161,160,157,157,157,
        162,162,161,163,162,157,157,157,
        162,162,161,161,163,158,158,158};
*/
    unsigned char pixel[DNUM] = { //random data
        141, 101, 126, 111, 163, 112, 133, 156,
        103, 144, 111, 176, 117, 120, 188, 187,
        175, 164, 190, 156, 112, 179, 142, 119,
        140, 111, 127, 186, 196, 190, 189, 127,
        185, 103, 185, 110, 192, 139, 159, 104,
        151, 193, 178, 198, 114, 170, 179, 149,
        124, 149, 165, 108, 141, 176, 113, 164,
        101, 140, 120, 126, 173, 189, 158, 184};
/*  unsigned char pixel[DNUM] = {
        202, 221, 159, 183, 41, 136, 247, 66,
        146, 29, 101, 108, 45, 61, 210, 236,
        90, 130, 54, 66, 132, 206, 119, 232,
        184, 135, 96, 78, 120, 41, 231, 203,
        150, 94, 172, 142, 122, 180, 150, 204,
        232, 121, 180, 221, 3, 207, 115, 147,
        72, 149, 169, 121, 76, 208, 235, 43,
        107, 58, 0, 237, 197, 7, 210, 89};
*/
    FrequencyCount(pixel);
    time1 = time(NULL);
    for (loop=0; loop<LOOP; loop++) {
        //set huffman nodes data and weight, i=0:255, j=1:64
        for (i=0, j=1, data_num=0; i<256; i++) {
            if (fCount[i]) {
                hfdata[j].weight = fCount[i];
                hfdata[j++].data = i;
                data_num ++;
            }
        }
        //build huffman tree and generate huffman code table
        HuffmanCodeTable(hfdata, code_table);
        //compress source data to huffman code using code table
        HuffmanCompress(pixel, hfcode, code_table);
        //initial hfdata and code_table
        for (j=0; j<2*DNUM; j++) {
            hfdata[j].data=0;
            hfdata[j].lchild=0;
            hfdata[j].parent=0;
            hfdata[j].rchild=0;
            hfdata[j].weight=0;
        }
    }
    time2 = time(NULL);
    //conclude
    printf("/n哈夫曼编码压缩图块,压缩报告/n华中科技大学力学系:李美之/n");
    printf("/n◎源数据(%d字节):/n ", DNUM);
    for (i=0; i<DNUM; i++) {
        printf(i%8==7 ? "%02X/n " : "%02X ", pixel[i]);
    }
    printf("/n◎压缩数据(%d字节):/n ", code_size);
    for (i=0; i<code_size; i++) {
        printf(i%8==7 ? "%02X/n " : "%02X ", hfcode[i]);
    }
    //打印码表
    printf("/n/n◎码表-编码字典(%d项)/n", data_num);
    for (i=0; i<256; i++) {
        if (code_table[i].codelength) {
            printf("%3d|%02X: ", i, i);
            for (j=0; j<code_table[i].codelength; j++) {
                printf("%d", ((code_table[i].code << j)&0x80)>>7);
            }
            printf("/t");
        }
    }
    printf("/n/n◎压缩率:%2.0f%% /t压缩时间:%.3f毫秒/n",(float)code_size/DNUM * 100, 1E3*(time2-time1)/LOOP);
}

void BitPrint(unsigned char *hfcode)
{
    int i, j;
    int endbit = last_bit;
    unsigned char thebyte;
    for (i=0; i < code_size-1; i++) {
        thebyte = hfcode[i];
        for (j=0; j<8; j++) {
            printf("%d", ((thebyte<<j)&0x80)>>7);
        }
    }
    if (last_bit == 7) {
        endbit = -1;
    }
    thebyte = hfcode[i];
    for (j=7; j>endbit; j--) {
        printf("%d", ((thebyte<<(7-j))&0x80)>>7);
    }
}

void HuffmanCompress(unsigned char *pixel, unsigned char *hfcode, HuffCode * code_table)
{
    int i, j;
    int curbit=7; //current bit in _thebyte_
    unsigned int bytenum=0; //number of destination code can also be position of byte processed in destination
    unsigned int ptbyte=0; //position of byte processed in destination
    unsigned int curlength; //code's length of _curcode_
    unsigned char curcode; //current byte's huffman code
    unsigned char thebyte=0; //destination byte write
    unsigned char value; //current byte's value (pixel[])
    //process every byte
    for (i=0; i<DNUM; i++) {
        value = pixel[i];
        curcode = (code_table[value]).code;
        curlength = (code_table[value]).codelength;
        //move out every bit from curcode to destination
        for (j=0;j<=curlength;j++) {
            if ((curcode<<j)&0x80) {
                thebyte |= (unsigned char)(0x01<<curbit);
            }
            curbit --;
            if (curbit < 0) {
                hfcode[ptbyte++] = thebyte;
                thebyte = 0;
                curbit  = 7;
                bytenum ++;
            }
        }
    }
    //think about which bit is the end
    if (curbit != 7) {
        hfcode[ptbyte] = thebyte;
        bytenum ++;
    }
    code_size = bytenum;
    last_bit  = curbit;
}

void HuffmanCodeTable(HuffNode *hfdata, HuffCode *code_table)
{
    int i, j; //variable for loop
    int tree_num = 2*data_num - 1; //node of huffman tree
    int min1, min2; //two minimum weight
    int p; //the id of parent node
    unsigned char curcode; //current code being processing
    int curlength; //current code's length
    //build huffman tree
    for (i=data_num; i<tree_num; i++) {
        HuffSelect(hfdata, i, &min1, &min2);
        hfdata[min1].parent = i+1;
        hfdata[min2].parent = i+1;
        hfdata[i+1].lchild = min1;
        hfdata[i+1].rchild = min2;
        hfdata[i+1].weight = hfdata[min1].weight + hfdata[min2].weight;
    }
    //generate huffman code
    //i present the i th code, j present from leaf to root in huffman tree
    //hfdata[i].data (0:255) is a byte number
    //编码从叶读到根,按位从高往低压入一个字节,读编码从左向右
    for (i=1; i<=data_num; i++) {
        curcode = 0;
        curlength = 0;
        for (j=i, p=hfdata[j].parent; p!=0; j=p, p=hfdata[j].parent) {
            curlength ++;
            if (j==hfdata[p].lchild) curcode >>= 1;
            else curcode = (curcode >> 1) | 0x80; //0x80 = 128 = B1000 0000
        }
        code_table[hfdata[i].data].code = curcode;
        code_table[hfdata[i].data].codelength = curlength;
    }
}

void HuffSelect(HuffNode *hfdata, int end, int *min1, int *min2)
{
    int i; //variable for loop
    int s1, s2;
    HuffNode wath[30];
    for (i=0; i<30; i++) {
        wath[i] = hfdata[i];
    }
    s1 = s2 = 1;
    while (hfdata[s1].parent) {
        s1++;
    }
    for (i=2; i<=end; i++) {
        if (hfdata[i].parent == 0 && hfdata[i].weight < hfdata[s1].weight) {
            s1 = i;
        }
    }
    while (hfdata[s2].parent || s1 == s2) {
        s2++;
    }
    for (i=1; i<=end; i++) {
        if (hfdata[i].parent ==0 && hfdata[i].weight < hfdata[s2].weight && (i - s1)) {
            s2 = i;
        }
    }
    *min1 = s1;
    *min2 = s2;
}

void FrequencyCount(unsigned char *chs)
{
    int i;
    for (i=0; i<DNUM; i++) {
        fCount[*(chs+i)] ++;
    }
}
 
MATLAB算法实战应用案例精讲-【数模应用】行程编码(RLE)(附Java、C++、python和MATLAB代码实现) 行程编码(Run Length Encoding,RLE),又称游程编码、行程长度编码、变动长度编码等,是一种统计编码。主要技术是检测重复的比特或字符序列,并用它们的出现次数取而代之。比较适合于二值图像的编码,但是不适用于连续色调图像的压缩,例如日常生活中的照片。为了达到较好的压缩效果,有时行程编码和其他一些编码方法混合使用。该压缩编码技术相当直观和经济,运算也相当简单,因此解压缩速度很快。RLE压缩编码尤其适用于计算机生成的图形图像,对减少存储容量很有效果。 阅读详情

相关推荐

C++实现四大无损压缩算法详解——霍夫曼、算术编码、自适应霍夫曼与LZW字典编码

无损压缩算法在保持数据完整性的同时,通过消除统计冗余实现存储空间的有效节约。其核心原理基于信息论中的香农熵,利用符号出现频率的不均匀性进行变长编码,典型代表包括霍夫曼编码、算术编码、LZW等。该技术广泛应用于ZIP/RAR归档、PNG图像、GIF动画、HTTP内容压缩(如gzip)等场景,确保数据在压缩-解压循环后完全还原。与有损压缩不同,无损方法不允许任何信息丢失,适用于文本、代码、配置文件等对精度敏感的数据类型。

weixin_42573757的博客 1452

文件压缩与解压(C语言版,数据结构)

期末大作业(哈希)

li3268859557的博客 2960

7-Zip极限压缩技术详解与实战

7-Zip 是一款开源、跨平台的文件压缩与解压工具,最初由俄罗斯程序员 Igor Pavlov 于 1999 年发布。它不仅完全免费,还提供了强大的压缩能力,尤其是对 7z 格式的高效支持,压缩率远高于 ZIP 和 RAR 等常见格式。7-Zip 的开源特性使其具备高度可定制性,并受到全球开发者社区的持续维护和优化。

weixin_42513870的博客 2918

zip压缩字节流 c语言,用C语言编写程序实现Zip或者Rar无损压缩算法

用C语言编写程序实现Zip或者Rar无损压缩算法/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** **HUFF.C Huffman encode for multimedia ap...

weixin_29534373的博客 872

迅雷早期版本Thunder.rar免注册高速下载工具

迅雷自2003年发布以来,凭借其创新的P2SP(Peer-to-Server & Peer)技术迅速成为中国互联网用户下载资源的首选工具。在宽带普及初期,网络资源分散、服务器带宽有限,传统HTTP/FTP下载常面临速度慢、连接中断等问题。迅雷通过整合多源下载、断点续传与智能调度机制,显著提升了文件获取效率。其典型安装包“Thunder.rar”不仅体现了早期软件分发的轻量化与去中心化特征,更承载了客户端自解压、免注册即用等用户体验设计思想。

weixin_35734408的博客 1512

深入解析经典文件压缩算法:Huffman与LZ系列实战详解

回顾几十年发展,文件压缩早已超越“节省空间”的原始目标,演变为影响系统性能、用户体验乃至能源消耗的关键环节。每一次HTTP响应的GZIP压缩,都在为全球节省PB级带宽;每一个手机App的APK瘦身,都直接影响下载转化率。而未来的方向也很清晰:更强的上下文建模:利用AI预测下一个符号,超越传统统计模型;GPU/TPU加速:将LZ匹配、Huffman解码等操作并行化;自适应流压缩:根据网络状况动态调整压缩强度;隐私保护压缩。

weixin_35391606的博客 928

rar用C语言怎样实现,用C语言编写程序实现Zip或者Rar无损压缩算法

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** **HUFF.C Huffman encode for multimedia application 8*8 pixel Ver ...

weixin_42299888的博客 609

C语言zip解压缩算法源代码

zip压缩方法,为了代码简练,笔者只保留了dynamic部分的解压缩,而把store和fixed两种压缩格式的压缩函数拿掉了,CRC校验部分的代码也拿掉了,需要的同学请根据GZIP的源代码自行加上。

无损压缩算法专题——LZSS算法实现

一、前言 本文是基于我的上一篇博客《无损压缩算法专题——无损压缩算法介绍》的基础上来实现的,博客链接https://blog.youkuaiyun.com/qq_34254642/article/details/103651815,这一篇当中实现基本的LZSS算法功能,先不做改进,所以算法效率比较低,但是便于理解。写了Python和C两个版本,两种语言的代码结构是一样的,代码中都有详尽的注释。实现了对任意文...

心城追梦的博客 8893

zip文件压缩解压源码 (c++)

zip 文件压缩 解压源码,c++版。已测试,100%可用! // XUnzip.cpp Version 1.3

什么是PMOS?什么是NMOS?两者有什么区别?

这个电压差被称为阈值电压(Vth),通常为0.7V至2V(低压NMOS)或4V至10V(功率NMOS)。当Vgs(栅极-源极电压)大于Vth时,沟道中的电子被吸引到栅极下方,形成导电通路,使电流可以从漏极流向源极。NMOS与PMOS的结构类似,都由三大部分组成:栅极(Gate)、源极(Source)和漏极(Drain)。由于NMOS在开启时,电子是主要的载流子,电子的迁移率比空穴高,因此NMOS通常具有更低的导通电阻(Rds(on)),这使其成为高速开关电路中的首选。它的沟道由电子(负载子)传导。

硅农深芯的博客 6435

数据压缩与打包:jar、war、arr、tar、zip

1,*.jar(JAR 文件,Java Archive File,Java 归档文件) 1)概念 是 Java 的一种文档格式。只包含了class文件与清单文件 ,不包含资源文件,是与平台无关的文件格式。 解压:jar文件使用了ZIP压缩格式。找一个jar文件,然后修改后缀名为‘zip’或者‘rar’格式,可解压该文件,点击‘com‘文件夹就会看到里面全部是‘.class’文件。 ZIP压缩 压......

午后阳光 3084

kaggle社区LLM Classification Finetuning

预测用户在一个由大型语言模型(LLMs)驱动的聊天机器人之间的正面交锋中会偏好哪些回应。获得来自聊天机器人竞技场(Chatbot Arena)的对话数据集,其中不同的LLMs对用户的提示生成答案。通过开发一个胜出的机器学习模型,帮助改进聊天机器人与人类的互动方式,并确保它们更好地符合人类的偏好。实际上是进行一个序列的分类。

m0_73542617的博客 1919

优秀解/压缩软件:7-Zip 超详细免费下载、安装与使用教程(真的很好用!)

7-Zip是一款免费开源的压缩软件,无广告无捆绑,安装包仅1-2MB。支持7z/ZIP/GZIP/TAR等常见格式,压缩率比ZIP小30%-70%,但不支持创建RAR文件。安装简单快捷,右键即可快速压缩/解压文件。相比WinRAR等商业软件,7-Zip以干净轻量、高压缩率为优势,是追求高效办公用户的理想选择。遇到右键菜单不显示或RAR5解压失败时,可尝试重启或管理员身份重装。

Mango_Bear_943的博客 1020

[OrCad电路板设计系统].Orcad.Pspice.9.2下载安装

Orcad.Pspice.9.2详细下载安装图文步骤1 安装前准备工作1.1 下载安装包1.2 解压2 安装时步骤2.1 安装文件2.2 破解文件3 安装完成 1 安装前准备工作 1.1 下载安装包 打开百度网盘APP 链接:https://pan.baidu.com/s/1cMFxHUvuh5iEhFVT-lvciQ 提取码:7m65 1.2 解压 解压下载好的安装包 2 安装时步骤 2.1 安装文件 1.点击Setup安装文件,出现警告对话框,告诉你应该关闭所有病毒防火墙,点击确定 2.进入安装界面,

weixin_48924581的博客 1万+

如何使用ArcGIS Pro制作带基底三维地图

点击运行生成范围线,因为之前对高程进行了夸大,导致生成的范围线和地形边缘不重合,我们打开范围线的图层属性,选择高程选项卡,要素位于选择地面上,如下图所示。目前制作的三维地图下面是空的一片,现在添加一个基底,在工具箱内点击“3D Analyst工具\栅格\转换\栅格范围”,调用栅格范围工具,如下图所示。打开ArcGIS Pro,新建一个局部场景,在高程表面下,地面上点击右键,选择添加高程源图层,将需要制作三维地图的DEM数据加载进来,如下图所示。在要素图层菜单内,类型选择绝对高度,如下图所示。

3978

图片查看&无损压缩工具Imagine 2.0.2 官方版&单文件绿色版

【​本章下载一】:https://pan.xunlei.com/s/VOUUoVm4of24xu5WNW58zJJWA1?PNG,JPG,GIF,BMP,PCX,TGA,TIFF,ICO,CUR,LBM,ANI,FLI,WMF,EMF等。3FR,ARW,CR2,CRW,DNG,ERF,KDC,MRW,NEF,ORF,RAF,RAW,SRW,SR2等。ZIP,RAR,7Z,ALZ,HV3,CBZ,CBR,CB7,ARJ,LZH,EGG,TAR,ISO,CAB等。

2786

SQL注入:联合查询的三个绕过技巧

在SQL注入中,可以利用科学计数法来绕过对输入的限制。例如,可以使用科学计数法来绕过对字符串长度的限制,通过将字符串拆分成多个部分并使用科学计数法来表示。此外,还可以利用数据库的特定特性或语法来替代原始的查询语句,从而执行联合查询或其他恶意操作。另外,还可以尝试利用无列名注入的技巧,通过在原始查询中使用通配符或其他方式来绕过对列名的限制,从而执行恶意操作。

qq_68163788的博客 3792

[Windows] 图片查看&无损压缩工具Imagine 2.20官方版&单文件绿色版【集成插件】

Imagine 是一款轻量级开源图片浏览器/处理工具(仅1MB),支持60+图像格式和数码相机RAW文件,具备批量转换、无损压缩、GIF制作、屏幕截图等功能。其特点包括:多语言界面(含中文)、绿色单文件版、插件扩展支持(WebP/AVIF等)、高兼容性(Windows/WinPE)。提供丰富的编辑功能(旋转/调色/滤镜等)和便捷操作(拖拽处理/快捷键),支持压缩包直接浏览。2025年最新版2.2.0新增JPEG XL格式支持、元数据展示和多线程优化,保持纯净无广告的特性,是高效图像处理的理想选择。

TB资源 1749

构建OneService:打造高效、安全、灵活的企业级数据服务平台

数据服务(OneService)作为统一的数据服务出口,实现了数据的统一市场化管理,有效地降低数据开放门槛的同时,保障了数据开放的安全。

数据与算法架构提升之路专栏 2106

ESD防护设计宝典(十):RE(辐射发射)超标问题排查与解决

RE测试是EMC认证的“头号杀手”。当屏幕上出现一根根超标频谱线时,如何快速定位元凶并有效整改?本讲将带你化身电磁侦探,完成一次完美的RE问题“缉凶”。

m0_56451176的博客 394
上一篇: c代码--快速排序问题
下一篇: C++经典面试题
wx红杉树
博客等级 码龄21年 383粉丝 296原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值