首先介绍一下RLE压缩算法:
游程编码(Run-,RLE)又称游程编码或变长编码,是控制理论中的一种二值图像的编码方法,用不同的码字对连续的黑白像素进行编码。 游程编码是一种简单的无损压缩方法,其特点是压缩和解压缩速度非常快。 这种方法就是简单地用重复字节和重复次数来描述重复字节,即将一系列连续的相同数据转换成特定的格式,以达到压缩的目的。
RLE是一种简单的压缩算法,主要用于压缩图像中连续重复的颜色块。 当然,RLE不仅仅适用于图像压缩,RLE可以压缩任何二进制数据。 原始图像文件的数据有一个特点,即存在大量连续重复的颜色数据。 RLE只是用来压缩大量连续重复数据的压缩代码,但是对于其他二进制文件,由于文件中出现相同数据的概率较少,使用RLE压缩这些重复性较小的文件的效果数据并不理想,有时压缩后的数据反而变大。
RLE压缩方案是一种极其成熟的压缩方案,其特点是无损压缩。
然后通过阅读这篇博客了解了文件的一些基本操作
最后直接上代码
(感觉仔细看完上面两个内容,就不需要过多解释了,代码中压缩函数都有注释,解压也类似,就不再写了)
#
#
#
无效拉链(字符*,字符*)
{//压缩函数
文件*输入,*输出;
整数;
炭电流,tmp;
if(!(in=fopen(,"rb")))//以二进制方式打开只读文件(原文件必须存在)
("打开文件失败\n");//如果文件不存在则提示
别的
out=fopen(,"wb");
cur=fgetc(in);//读取一个字符,返回读取到的字符,读取到文件末尾时返回EOF
tmp=cur;
=1;
while(!feof(in))
cur = fgetc(in);
如果(cur==tmp){
++;
}//RLE压缩
别的 {
fputc(+'0',out);//写入一个字符(这里是计数),如果失败,返回EOF
fputc(tmp,out);//同上,这里是原始字符
tmp=cur;
=1;
(在);
(out);//关闭文件
无效解压缩(字符*,字符*)
{//解压函数,注释会和上面基本一样,不再赘述
文件*输入,*输出;
整数;
炭电流;
if(!(in=fopen(,"rb")))
(“打开文件失败\n”);
别的
输出 = fopen(,"wb");
while(!feof(in)){
= fgetc(in)-'0';
if(feof(in)) 中断;
cur = fgetc(in);
尽管( - )
fputc(cur,输出);
(在);
(出去);
int main(int argc,char *argv[])
{//通过判断命令行参数进行相应的操作
if(!(argv[2], "-d"))
解压(argv[1],argv[3]);
(“\n”);
否则 if(!(argv[2],"-c"))
zip(argv[1], argv[3]);
(“\n”);
别的
("输入参数错误,请重新检查,-c:;-d:\n");
0;
标签: 解压, cur, RLE, 压缩, argv, C语言, out