RLE算法:这种压缩编码是一种变长的编码,RLE根据文本不同的具体情况会有不同的压缩编码变体与之相适应,以产生更大的压缩比率。

变体:重复次数+字符

文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。

/***********************************************************************************************************

RLE.c

本演示程序提供了RLE的压缩和解压缩函数

**********************************************************************************************************/

#include

#include

#include

/* 函数原型 */

int RLE_Compression(char * infile_name, char * outfile_name);

int RLE_Decompression(char * infile_name, char * outfile_name);

/* 主程序 */

void main(int argc, char *argv[])

{

printf("RLE compression and decompression utility/n");

if (4 != argc)

{

printf("/nUsage : rle -c|d sourcefilename targetfilename/n");

exit(0);

}

if (! strcmp(argv[1], "-c"))

{

printf("/nCompress...");

RLE_Compression(argv[2], argv[3]);

}

else if (! strcmp(argv[1], "-d"))

{

printf("/nDecompress...");

RLE_Decompression(argv[2], argv[3]);

}

else

printf("/nUnknow command./n");

}

/**************************************************************************

RLE_Decompression ()

本函数用RLE算法对文件进行解压缩

**************************************************************************/

int RLE_Decompression(char * infile_name, char * outfile_name)

{

register int seq_len, i;

char scratch_space[255],cur_char;

FILE *infile, *outfile;

if ((infile=fopen(infile_name, "rb")) == NULL)

{

strcpy(scratch_space, "Unable to open ");

strcat(scratch_space, infile_name);

puts(scratch_space);

return 1;

}

if ((outfile=fopen(outfile_name, "wb")) == NULL)

{

strcpy(scratch_space, "Unable to open ");

strcat(scratch_space, outfile_name);

puts(scratch_space);

return 1;

}

if ( feof(infile) )

{

return 0;

}

while (!feof(infile))

{

seq_len = (int)fgetc( infile );

cur_char = fgetc( infile );

for ( i = 0; i < seq_len; i++ )

{

fputc( cur_char, outfile );

}

}

fclose(infile);

fclose(outfile);

return 0;

}

/**************************************************************************

RLE_Compression ()

本函数用RLE算法对文件进行压缩

**************************************************************************/

int RLE_Compression(char * infile_name, char * outfile_name)

{

register int seq_len;

char scratch_space[255],cur_char, cur_seq;

FILE *infile, *outfile;

if ((infile=fopen(infile_name, "rb")) == NULL)

{

strcpy(scratch_space, "Unable to open ");

strcat(scratch_space, infile_name);

puts(scratch_space);

return 1;

}

if ((outfile=fopen(outfile_name, "wb")) == NULL)

{

strcpy(scratch_space, "Unable to open ");

strcat(scratch_space, outfile_name);

puts(scratch_space);

return 1;

}

if ( feof(infile) )

{

return 0;

}

cur_char = fgetc(infile);

cur_seq = cur_char;

seq_len = 1;

while (!feof(infile))

{

cur_char = fgetc(infile);

if ( cur_char == cur_seq )

{

seq_len++;

}

else

{

fputc( seq_len, outfile );

fputc( cur_seq, outfile );

cur_seq = cur_char;

seq_len = 1;

}

}

fclose( infile );

fclose( outfile );

return 0;

}

以上算法比较适合重复次数比较多的文件,否则不但不能达到压缩的效果,反而使文件倍增!!!

用c语言实现倍增原理,RLE算法变体C语言实现相关推荐

  1. java合一算法_Prolog语言的编译原理:合一算法

    Prolog语言的编译原理:合一算法 分类:软考 | 更新时间:2016-07-08| 来源:转载 Prolog是一种基于谓词演算的程序设计语言.Prolog是一种说明性语言,它的基本意思是程序员着重 ...

  2. 凯撒密码(Caesar)的原理和算法实现(C语言)

    凯撒密码(Caesar)的原理和算法实现 1.凯撒密码的原理: 它是一种古典密码体质下的一种密码,是一种移位密码,具有单表密码的性质,密文和明文都使用同一个映射,为了保证加密的可逆性,要求映射都是一一 ...

  3. c语言通用数据结构和常用算法库,基于C语言的通用数据结构和算法库

    本人最近在学习数据结构的课程,在过程中发现用C语言来实现各种数据结构类型的时候很难做到真正意义上的通用的数据结构,于是在网上搜罗了一些所谓的C语言通用数据结构库,在此也将这些数据结构库一一罗列,方便大 ...

  4. c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  5. 最小生成树普里姆算法c语言代码,普里姆算法生成最小生成树-C语言描述.doc

    PAGE JIN JINGCHU UNIVERSITY OF TECHNOLOGY <数据结构(C语言描述)> 课程设计 学 院 计算机工程学院 班 级 12级软件技术1班 学 号 201 ...

  6. 滑动窗口滤波 c语言,关于中值滤波算法,以及C语言实现

    1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护 ...

  7. 滑动窗口滤波 c语言,关于中值滤波算法,以及C语言实现(转)

    1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护 ...

  8. c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区

    决策树之C4.5算法详解 主要内容 C4.5算法简介 分裂属性的选择--信息增益率 连续型属性的离散化处理 剪枝--PEP(Pessimistic Error Pruning)剪枝法 缺失属性值的处理 ...

  9. C语言orders order订单的算法(附完整源码)

    C语言orders order订单的算法 订单问题 C语言orders order订单的算法完整源码(定义,实现,main函数测试) 订单问题 约翰正在接受命令. 第i个订单是在第ti个时间由第i个客 ...

最新文章

  1. Java for LeetCode 114 Flatten Binary Tree to Linked List
  2. Zabbix5.0监控系统安装详解
  3. windows下安装使用couchdb
  4. session.merge 缓存不更新_这几个缓存更新的设计你都知道吗?
  5. SQL Server 2008中SQL之WaitFor
  6. 求和(1,2,3.....n使其和为m的所有情况)
  7. Solidworks踩坑随笔
  8. mac的rubywoo怎么读_macrubywoo是几号
  9. 啦啦外卖UNIAPP(4.0)源码商家+骑手
  10. Thor 1.5.3中文版 (使用自定义按键启动软件)
  11. linux用户权限不够解析及解决方案
  12. oracle总结: INTERVAL DAY TO SECOND, 但却获得 NUMBER
  13. 创客使用Fusion 360 - 草绘
  14. 电脑网线水晶头接法图解
  15. Visio中的字体对应Word中字体字号
  16. centos7脚本部署云盘(seafile)
  17. Kotlin 概述【官方】
  18. 多线程-如何用多线程去并行传输文件
  19. 【读书笔记】20210720《系统之美》——德内拉·梅多斯
  20. Android 如何使系统快速重启

热门文章

  1. 重新命名的linux命令,Linux 重命名命令自制详细介绍
  2. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(1) - 概述 传输指令
  3. Esp8266物联网开发板详细使用教程
  4. 图文理解 Spark 3.0 的动态分区裁剪优化
  5. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(1)
  6. opencv 叠加文字_opencv 图像上添加文字
  7. java 摸拟qq消息提示_java 仿qq消息提示框
  8. 纯后处理的volumetric light
  9. Direct3D9 Fx/HLSL的若干条有用的笔记
  10. 关于IOS内存机制的较深入分析