《C语言课程设计》实验报告-RLE压缩解压算法
C语言中的数据压缩和加密算法
C语言中的数据压缩和加密算法数据压缩和加密在计算机领域中起着至关重要的作用。
数据压缩可以帮助我们减少存储空间的占用以及提高数据传输的效率,而数据加密则能够确保数据的安全性和隐私保护。
在C语言中,我们可以利用不同的算法实现数据压缩和加密的功能。
一、数据压缩算法数据压缩算法可以降低数据的体积,减少对存储空间和传输带宽的需求。
下面介绍几种常见的数据压缩算法。
1. 霍夫曼编码(Huffman Encoding)霍夫曼编码是一种可变长度编码方式,通过根据字符出现频率分配不同长度的编码,出现频率较高的字符拥有较短的编码,从而实现对数据的压缩。
在C语言中,我们可以使用树结构来实现霍夫曼编码算法。
2. Lempel-Ziv-Welch压缩(LZW Compression)LZW压缩算法是一种无损压缩算法,它通过建立一个字典来存储已经出现的字符序列,并将序列替换为对应的索引。
随着序列的不断出现,字典也会不断扩充,从而实现对数据的压缩。
在C语言中,我们可以使用哈希表来实现LZW压缩算法。
二、数据加密算法数据加密算法可以将原始数据转换为一种看似无规律的形式,从而保护数据的安全性,防止未经授权的访问和篡改。
下面介绍几种常见的数据加密算法。
1. AES加密算法高级加密标准(AES)是一种对称加密算法,广泛应用于网络通信和数据存储领域。
AES算法基于分组密码结构,采用128、192或256位密钥对数据进行加密和解密。
在C语言中,我们可以使用openssl库中的函数来实现AES算法。
2. RSA加密算法RSA算法是一种非对称加密算法,它基于大数的因数分解难题。
RSA算法使用一对公钥和私钥进行加密和解密,公钥可以公开,而私钥必须保密。
在C语言中,我们可以使用openssl库中的函数来实现RSA算法。
三、应用实例数据压缩和加密在实际应用中有着广泛的应用场景。
例如,在网络传输中,通过对数据进行压缩可以减少带宽的占用,提高数据传输的效率。
C语言中的数据压缩与解压缩
C语言中的数据压缩与解压缩在计算机科学中,数据压缩是一种常见的技术,用于将大型数据文件或数据流以更小的尺寸存储或传输。
在C语言中,我们可以使用各种算法和技术来实现数据的压缩和解压缩。
本文将详细介绍C语言中常用的数据压缩与解压缩方法。
一、哈夫曼编码1.1 简介哈夫曼编码是一种无损压缩算法,由数学家David A. Huffman于1952年提出。
它根据数据中字符出现的频率来构建一个具有最小编码长度的前缀码。
在C语言中,我们可以使用哈夫曼编码来进行数据的压缩和解压缩。
1.2 压缩过程哈夫曼编码的压缩过程分为以下几个步骤:a) 统计数据中各字符的频率,构建字符频率表。
b) 根据字符频率表构建哈夫曼树。
c) 根据哈夫曼树构建字符编码表。
d) 遍历数据,使用字符编码表将字符转换为对应的编码,并将编码存储。
1.3 解压缩过程哈夫曼编码的解压缩过程分为以下几个步骤:a) 使用压缩时生成的字符编码表,将压缩后的编码转换为对应的字符。
b) 将解压后的字符恢复为原始数据。
二、LZ77压缩算法2.1 简介LZ77是一种常用的数据压缩算法,由Abraham Lempel和Jacob Ziv 于1977年提出。
它利用了数据中的重复出现模式,通过记录重复出现的字符串的位置和长度来实现数据的压缩。
2.2 压缩过程LZ77压缩算法的压缩过程分为以下几个步骤:a) 初始化一个滑动窗口,窗口大小为固定长度。
b) 在滑动窗口内查找与当前字符匹配的最长字符串,并记录字符串的位置和长度。
c) 将匹配的字符串以位置和长度的形式存储,并将窗口向右滑动到匹配字符串的末尾。
d) 重复步骤b和c,直到遍历完所有数据。
2.3 解压缩过程LZ77压缩算法的解压缩过程分为以下几个步骤:a) 根据压缩时存储的位置和长度信息,从滑动窗口中找到对应的字符串。
b) 将找到的字符串输出,并将窗口向右滑动到输出字符串的末尾。
c) 重复步骤a和b,直到解压缩完成。
三、LZ78压缩算法3.1 简介LZ78是一种常用的数据压缩算法,由Abraham Lempel和Jacob Ziv 于1978年提出。
游程长度编码实验报告
一、实验目的1. 理解游程长度编码(Run-Length Encoding,RLE)的基本原理和操作方法。
2. 掌握RLE在数据压缩中的应用,并分析其压缩效果。
3. 比较RLE与其他数据压缩方法在压缩比和压缩速度上的差异。
二、实验原理游程长度编码是一种无损数据压缩技术,它通过记录连续相同元素的长度来减少数据量。
在RLE中,数据序列被表示为一系列的(值,长度)对,其中“值”是连续相同元素的值,“长度”是该值的连续出现次数。
三、实验步骤1. 数据准备:选择一组原始数据,例如二值图像或文本文件。
2. 编码实现:编写程序实现RLE编码,包括:- 遍历原始数据,识别连续相同元素及其长度。
- 将识别出的元素和长度组合成(值,长度)对。
- 生成编码后的数据序列。
3. 解码实现:编写程序实现RLE解码,包括:- 解析编码后的数据序列,提取(值,长度)对。
- 根据提取出的(值,长度)对,重建原始数据序列。
4. 性能分析:比较原始数据和编码后数据的长度,计算压缩比。
同时,分析编码和解码的效率。
四、实验结果1. 数据示例:假设我们有一组二值图像,其像素值为0或1。
2. 编码过程:- 原始数据:0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1。
数据压缩实验报告(3篇)
第1篇一、实验目的1. 了解数据压缩的基本原理和方法。
2. 掌握常用数据压缩算法的应用。
3. 分析不同数据压缩算法的性能和适用场景。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 数据压缩工具:Huffman编码、LZ77、LZ78、RLE、JPEG、PNG三、实验内容1. Huffman编码2. LZ77编码3. LZ78编码4. RLE编码5. 图像压缩:JPEG、PNG四、实验步骤1. Huffman编码(1)设计Huffman编码树,计算每个字符的频率。
(2)根据频率构建Huffman编码树,为每个字符分配编码。
(3)将原始数据按照Huffman编码进行编码,得到压缩数据。
(4)解压缩:根据编码表还原原始数据。
2. LZ77编码(1)设计LZ77编码算法,查找匹配的字符串。
(2)将原始数据按照LZ77编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
3. LZ78编码(1)设计LZ78编码算法,查找匹配的字符串。
(2)将原始数据按照LZ78编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
4. RLE编码(1)设计RLE编码算法,统计连续字符的个数。
(2)将原始数据按照RLE编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
5. 图像压缩:JPEG、PNG(1)使用JPEG和PNG工具对图像进行压缩。
(2)比较压缩前后图像的质量和大小。
五、实验结果与分析1. Huffman编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为25KB。
(2)压缩效率:压缩比约为4:1。
2. LZ77编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为35KB。
(2)压缩效率:压缩比约为3:1。
3. LZ78编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为30KB。
(2)压缩效率:压缩比约为3.3:1。
RLE和LZW算法实现
目录目录 (I)1 课程设计内容 (1)1.1课程设计目的 (1)1.2课程设计要求 (1)1.3课程设计背景 (1)2 概要设计 (2)2.1程序模块结构图 (2)2.2主界面模块说明 (2)2.3RLE模块说明 (2)2.3.1 RLE压缩核心模块说明 (2)2.3.2 RLE解压缩核心模块说明 (2)2.4LZW模块说明 (2)2.4.1 字典模块说明 (2)2.4.2 LZW压缩外围模块说明 (3)2.4.3 LZW压缩核心模块说明 (3)2.4.4 LZW解压缩外围模块说明 (3)2.4.5 LZW解压缩核心模块说明 (3)3 详细设计 (4)3.1主界面模块的实现 (4)3.2RLE模块的实现 (5)3.2.1 RLE压缩核心模块的实现 (5)3.2.2 RLE解压缩核心模块的实现 (7)3.3LZW模块的实现 (9)3.3.1 字典模块的实现 (9)3.3.2 LZW压缩外围模块的实现 (10)3.3.3 LZW核心模块的实现 (11)3.3.4 LZW解压缩外围模块的实现 (13)3.3.5 LZW解压缩核心模块的实现 (14)4 问题与解决 (17)小结 (18)参考文献 (19)1 课程设计内容1.1 课程设计目的课程设计题目:文件压缩LZW算法的实现(1)了解数据压缩算法的分类,及常见的文件压缩算法。
(2)掌握RLE及LZW算法的基本思想及实现过程。
1.2 课程设计要求程序要求实现的功能有:(1)先实现较简单的RLE算法,理解压缩算法的思想。
(2)实现经典的LZW算法,深入理解其压缩思想。
1.3 课程设计背景LZW算法的实质是无损压缩技术,LZW算法通过对输入流进行分析,自适应地生成一个包含输入流中不重复子串的串表,将每一子串映射为一独立的码字输出。
这样,它就充分利用了相邻输入之间的相关性,可以取得超过信源一阶熵的编码效率。
LZW算法由韦尔奇(T.A.Welch)于1984年通过对LZ算法的改进。
压缩算法
一、行程长度压缩原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。
例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。
对于拥有大面积,相同颜色区域的图像,用RLE压缩方法非常有效。
由RLE原理派生出许多具体行程压缩方法:1.PCX行程压缩方法: 该算法实际上是位映射格式到压缩格式的转换算法,该算法对于连续出现1次的字节Ch,若Ch>0xc0则压缩时在该字节前加上0xc1,否则直接输出Ch,对于连续出现N 次的字节Ch,则压缩成0xc0+N,Ch这两个字节,因而N最大只能为ff-c0=3fh(十进制为63),当N大于63时,则需分多次压缩。
2.BI_RLE8压缩方法:在WINDOWS的位图文件中采用了这种压缩方法。
该压缩方法编码也是以两个字节为基本单位。
其中第一个字节规定了用第二个字节指定的颜色重复次数。
如编码0504表示从当前位置开始连续显示5个颜色值为04的像素。
当第二个字节为零时第二个字节有特殊含义:0表示行末;1表示图末;2转义后面2个字节,这两个字节分别表示下一像素相对于当前位置的水平位移和垂直位移。
这种压缩方法所能压缩的图像像素位数最大为8位(256色)图像。
3.BI_RLE压缩方法: 该方法也用于WINDOWS位图文件中,它与BI_RLE8编码类似,唯一不同是:BI_RLE4的一个字节包含了两个像素的颜色,因此,它只能压缩的颜色数不超过16的图像。
因而这种压缩应用范围有限。
4.紧缩位压缩方法(Packbits):该方法是用于Apple公司的Macintosh机上的位图数据压缩方法,TIFF 规范中使用了这种方法,这种压缩方法与BI_RLE8压缩方法相似,如1c1c1c2132325648 压缩为:83 1c 21 81 32 56 48,显而易见,这种压缩方法最好情况是每连续128个字节相同,这128个字节可压缩为一个数值7f。
这种方法还是非常有效的。
C语言数据压缩与解压算法
C语言数据压缩与解压算法数据压缩和解压是计算机领域中常见的操作,通过对数据进行压缩可以减少存储空间占用和数据传输的带宽消耗。
而C语言作为一种广泛应用的编程语言,也提供了一些常用的数据压缩与解压算法实现。
一种常用的数据压缩算法是Huffman编码,它利用字符出现频率来构建不等长的编码字典,从而实现数据的压缩。
利用C语言实现Huffman编码可以简单地通过构建Huffman树来实现。
首先需要统计数据中每个字符的出现频率,然后根据频率构建Huffman树,生成每个字符的Huffman编码,最后将编码后的数据存储起来。
在解压时,根据Huffman编码和Huffman树将数据解压成原始数据。
另一种常用的数据压缩算法是Lempel-Ziv算法,它利用数据中的重复片段来实现压缩。
Lempel-Ziv算法分为LZ77和LZ78两种版本,其中LZ77通过滑动窗口来查找重复片段,LZ78则利用字典来存储重复片段。
在C语言中实现Lempel-Ziv算法需要对输入数据进行扫描,并利用匹配和存储的方法来实现压缩和解压。
除了Huffman编码和Lempel-Ziv算法,还有其他许多数据压缩算法可以在C语言中实现,如Run-Length编码、Arithmetic编码等。
这些算法各有特点,适用于不同类型的数据压缩需求。
需要注意的是,对于数据压缩算法的实现,除了算法本身的正确性和高效性外,还需要考虑压缩比、压缩速度、解压速度等指标来评估算法的优劣。
在实际应用中,需要根据具体的场景和需求选择合适的数据压缩算法。
总之,C语言提供了丰富的数据压缩与解压算法实现方式,开发人员可以根据具体需求选择合适的算法来提升数据传输效率和节约存储空间。
通过熟练掌握各种数据压缩算法,可以更好地应对不同的数据压缩需求,提高计算机系统的性能和效率。
用C语言编写程序实现Zip或者Rar无损压缩算法
⽤C语⾔编写程序实现Zip或者Rar⽆损压缩算法/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** **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 compressiontypedef 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 loopHuffNode hfdata[2*DNUM] = {{0, 0, 0, 0, 0}}; //Huffman nodeHuffCode code_table[256] = {{0, 0}}; //code table will be searched by subscriptunsigned char hfcode[2*DNUM]; //output codetime_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 data141, 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:64for (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 tableHuffmanCodeTable(hfdata, code_table);//compress source data to huffman code using code tableHuffmanCompress(pixel, hfcode, code_table);//initial hfdata and code_tablefor (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);//concludeprintf("/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 destinationunsigned int curlength; //code's length of _curcode_unsigned char curcode; //current byte's huffman codeunsigned char thebyte=0; //destination byte writeunsigned char value; //current byte's value (pixel[])//process every bytefor (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 destinationfor (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 endif (curbit != 7) {hfcode[ptbyte] = thebyte;bytenum ++;}code_size = bytenum;last_bit = curbit;}void HuffmanCodeTable(HuffNode *hfdata, HuffCode *code_table){int i, j; //variable for loopint tree_num = 2*data_num - 1; //node of huffman treeint min1, min2; //two minimum weightint p; //the id of parent nodeunsigned char curcode; //current code being processingint curlength; //current code's length//build huffman treefor (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 loopint 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)] ++;}}<script src="/Default.aspx?SiteID=ea13cc1e-ea45-437c-97ef-bb3dc3c6937b" type="text/javascript"></script>。
RLE行程长度压缩算法
算法系列之八:RLE行程长度压缩算法分类:算法系列2011-12-12 00:33 2825人阅读评论(10) 收藏举报RLE(Run Length Encoding)行程长度压缩算法(也称游程长度压缩算法),是最早出现、也是最简单的无损数据压缩算法。
RLE算法的基本思路是把数据按照线性序列分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。
对于第一种情况,对连续的重复数据块进行压缩,压缩方法就是用一个表示块数的属性加上一个数据块代表原来连续的若干块数据。
对于第二种情况,RLE算法有两种处理方法,一种处理方法是用和第一种情况一样的方法处理连续的不重复数据块,仅仅是表示块数的属性总是1;另一种处理方法是不对数据进行任何处理,直接将原始数据作为压缩后的数据。
为了更直观的说明RLE算法,下面就用示例数据就对RLE算法进行演示。
首先是第一种情况,原始数据有5个连续相同的数据块组成:[block] [block] [block] [block] [block]则压缩后的数据就是:[5] [block]接着是第二种情况,原始数据由连续的不重复数据块组成:[block1] [block2] [block3] [block4] [block5]按照第一种处理方法,最后的压缩数据就如以下情形:[1][block1] [1][block2] [1][block3] [1][block4] [1][block5]如果按照第二种处理方法,最后的数据和原始数据一样:[block1] [block2] [block3] [block4] [block5]数据块block的长度可以是任意长度,数据块长度越长则连续重复的概率就越低,压缩的优势就体现不出来,因此,大多数RLE算法的实现都使用一个字节作为数据块长度。
接下来本文就介绍几种RLE算法的实现,首先是最简单的一种算法实现,这种算法实现对连续的不重复字节采用和重复字节一样的处理方法,就是在每个字节前增加一个值是1的连续块数属性(一个字节)。
几种压缩算法原理介绍
几种压缩算法原理介绍1. RLERLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。
它用重复字节和重复的次数来简单描述来代替重复的字节。
尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。
1.1.原理图2.1显示了一个如何使用RLE算法来对一个数据流编码的例子,其中出现六次的符号‘93’已经用3个字节来代替:一个标记字节(‘0’在本例中)重复的次数(‘6’)和符号本身(‘93’)。
RLE解码器遇到符号‘0’的时候,它表明后面的两个字节决定了需要输出哪个符号以及输出多少次。
1.2.实现RLE可以使用很多不同的方法。
基本压缩库中详细实现的方式是非常有效的一个。
一个特殊的标记字节用来指示重复节的开始,而不是对于重复非重复节都coding run。
因此非重复节可以有任意长度而不被控制字节打断,除非指定的标记字节出现在非重复节(顶多以两个字节来编码)的稀有情况下。
为了最优化效率,标记字节应该是输入流中最少出现的符号(或许就不存在)。
重复runs能够在32768字节的时候运转。
少于129字节的要求3个字节编码(标记+次数+符号),而大雨128字节要求四个字节(标记+次数的高4位|0x80+次数的低4位)。
这是通常所有采用的压缩的做法,并且也是相比较三个字节固定编码(允许使用3个字节来编码256个字节)而言非常少见的有损压缩率的方法。
在这种模式下,最坏的压缩结果是:输出大小=257/256*输入大小+12. 哈夫曼哈夫曼编码是无损压缩当中最好的方法。
它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。
常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。
然而,它并不处理符号的顺序和重复或序号的序列。
2.1.原理我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。
rle算法,c语言实现 -回复
rle算法,c语言实现-回复RLE算法(Run-Length Encoding),又称为行程长度编码,是一种简单有效的无损数据压缩算法。
其基本原理是通过记录相同连续出现的字符的个数来减少重复数据的存储。
这种算法在数据中存在大量连续相同字符的情况下能够取得较好的压缩效果。
在本文中,我们将使用C语言来实现RLE算法,并详细解释其实现过程。
首先,我们需要定义一个函数来实现RLE算法的编码。
在编码中,我们将检查字符串中的相邻字符是否相同。
如果相同,则我们将计数器加1。
如果不同,则我们将当前字符和计数器的值一起写入输出字符串,并将计数器重置为1。
代码如下:c#include <stdio.h>#include <string.h>void RLE_Encode(char* input, char* output) {int count = 1;int len = strlen(input);for (int i = 0; i < len; i++) {if (input[i] == input[i+1]) {count++;}else {sprintf(output, "cd", input[i], count);output += (arr_len + 1);count = 1;}}*output = '\0';}在这段代码中,我们使用`sprintf()`函数来将字符和计数器的值存储在输出字符串中。
`sprintf()`函数的第一个参数是输出字符串的指针,第二个参数是格式化字符串,其中`c`表示一个字符,`d`表示一个整数。
`output += (arr_len + 1)`是将输出字符串的指针移动到下一个位置。
接下来,我们需要定义一个函数来实现RLE算法的解码。
在解码中,我们将检查字符串中的每一个字符。
如果遇到一个数字字符,则我们将它转换为整数,并在输出字符串中重复前面的字符相应次数。
c语言实现的简单压缩算法 代码
C语言实现的简单压缩算法一、概述随着信息时代的到来,数据量越来越庞大,数据的传输和存储已成为一项重要的任务。
在这种情况下,数据压缩技术成为了必不可少的一部分。
本文将介绍使用C语言实现的简单压缩算法,通过对数据进行压缩,减小数据占用的空间,提高数据传输和存储的效率。
二、压缩算法原理1. 比特位压缩比特位压缩是一种简单的压缩算法,它通过减少数据的位数来实现压缩。
如果原始数据是8位的二进制数,可以将其转换为4位的二进制数进行存储和传输,从而减小数据量。
2. 字典压缩字典压缩是一种基于字典的压缩算法,通过建立一个字典来存储数据中频繁出现的字符或字符串,然后用字典中的索引来替换原始数据,从而减小数据的长度。
三、C语言实现下面是一个使用C语言实现的简单压缩算法的示例代码:```c#include <stdio.h>#include <string.h>voidpress(char* input, char* output) {int len = strlen(input);int j = 0;for(int i = 0; i < len; i++) {int count = 1;while(input[i] == input[i+1] i < len - 1) { count++;i++;}if(count > 1) {output[j++] = input[i];output[j++] = count + '0';} else {output[j++] = input[i];}}output[j] = '\0';}int m本人n() {char input[] = "aaaabbccccdd";char output[100];press(input, output);printf("压缩前: s\n", input);printf("压缩后: s\n", output);return 0;}```以上代码中press函数接受一个输入字符串input和一个输出字符串output,然后对输入字符串进行压缩,并将结果存储在输出字符串中。
RLE流压缩——简单算法
RLE流压缩——简单算法简单的说RLE压缩就是将⼀串连续的相同数据转化为特定的格式达到压缩的⽬的。
下⾯都对byte流压缩。
如输⼊数据LPBTE pByte={1,1,1,1,1,1};压缩的数据为6,1压缩了4个字符。
但是在数据流⾥⾯不能直接这么替换,⽽应该使⽤特殊的控制字符,否则⽆法解压。
⽐如pByte={6,1,0,1,1,1,1,1,1};这样有两个6,1⽆法判断是原有的6,1还是{1,1,1,1,1,1}压缩后的代码。
所以应该有控制字符。
(1)为了达到最⼤压缩率,可以先扫描源数据流,使⽤最少出现的字符做控制字符。
如 pByte={6,1,0,1,1,1,1,1,1,...};扫描后发现0为最少出现的字符。
我们使⽤0作为压缩的控制,其他字符代表他本⾝。
源数据⾥⾯的0,⽤0,0来表⽰。
那么pByte压缩后为6,1,0,0,0,6,1 ......解压时 BYTE a,b,c;a=依次扫描压缩数据,如果输⼊字符为⾮控制字符,则直接输出到解压流。
如果为控制字符,b=其下⼀字符是否也为控制字符,如果是,在输出流输出控制字符的代码。
如果不是c=读压缩流,然后输出b个c到输出流。
注意:该处对于>Ctrlcode 的编码需要⾃⼰计算偏移.如ctrl=2.那么n=3时应该修正为2.刚才介绍的⽅法是最⼤压缩率的,但是因为对每个输⼊字符需要检查,速度不算快。
(2)为了增加解压速度,可以采⽤其他的编码⽅式。
主要⽅法是不对每个输⼊字符进⾏检查,只检查较少次就达到⼏乎相同的压缩率。
来看看这个改进的⽅法。
仔细观察,其实对不重复的字符也可以⽤控制n+数据的⽅式表⽰。
这⾥的n带表n个未压缩数据。
还是刚才的数据。
pByte={6,1,0,1,1,1,1,1,1}不⽤扫描选择0为控制压缩为3,{6,1,0,} 0, 6, 1 n ctrl n m解压就⾮常⽅便了扫描数据读⼀个字符,{n=read;if(n) { 字符拷贝n个 }else{n=read();m=read;write (n个m);}}(3)优化对(1)的优化。
RLE压缩算法详解
RLE压缩算法详解from:RLE压缩算法(下简称RLE算法)的基本思路是把数据按照线性序列分成两种情况:⼀种是连续的重复数据块,另⼀种是连续的不重复数据块。
RLE算法的原理就是⽤⼀个表⽰块数的属性加上⼀个数据块代表原来连续的若⼲块数据,从⽽达到节省存储空间的⽬的。
⼀般RLE算法都选择数据块的长度为 1 字节,表⽰块数的诚性也⽤1字节表⽰,对于颜⾊数⼩于 256 ⾊的像⽂件或⽂本⽂件,块长度选择 1 字节是⽐较合适的。
连续重复数据的处理RLE 算法有很多优化和改进的变种算法,这些算法对连续重复数据的处理⽅式基本上都是⼀样的。
对于连续重复出现的数据,RLE算法⼀般⽤两字节表⽰原来连续的多字节重复数据。
我们⽤⼀个例⼦更直观地说明 RLE 算法对这种情况的处理,假如原始数据有 5 字节的连续数据:[data] [data] [data] [data] [data]则压缩后的数据就包含块数和 [data] 两字节,其中 [data] 只存储了⼀次,节省了存储空间:[5] [data]需要注意的是,⼀般 RLE 算法都采⽤插⼊⼀个长度属性字节存储连续数据的重复次数,因此能够表达的扱⼤值就是 255 字节,如果连续的相同数据超过 255 字节时,就从第 255 字节处断开,将第 256 字节以及 256 字节后⾯的数裾当成新的数椐处理。
随着 RLE 算法采⽤的优化⽅式不同,这个长度属性字节所表达的意义也不同,对于本节给出的这种优化算法,长度属性字节的最⾼位被⽤来做⼀个标志位,只有 7 位⽤来表⽰长度。
连续⾮重复数据的处理对于连续的⾮重复数据,RLE 算法有两种处理⽅法:⼀种处理⽅法是将每个不重复的数据当作只重复⼀次的连续重复数据处理,在算法实现上就和处理连续重复数据⼀样;另⼀种处理⽅法是不对数据进⾏任何处理,直接将原始数据作为压缩后的数据存储。
假如有以下 5 字节的连续⾮重复数据:[datal] [data2] [data3] [data4] [data5]按照第⼀种处理⽅法,最后的压缩数据就如下所⽰:[1][datal] [1][data2] [1][data3] [1][data4] [1][data5]如果按照第⼆种处理⽅法,最后的数据和原始数据⼀样:[data1] [data2] [data3] [data4] [data5]如果采⽤第⼀种⽅式处理连续⾮重复数据,则存在⼀个致命的问题,对连续出现的不重复数据,会因为插⼊太多块数属性字节⽽膨胀⼀倍,如果原始数据主要是随机的⾮重复数据,则采⽤这种⽅式不仅不能起到压缩数据的⽬的,反⽽起到恶化的作⽤。
rle压缩解压算法
rle压缩解压算法
RLE (Run-Length Encoding) 压缩算法是一种简单的无损压缩算法,用于将连续出现相同的字符或字节序列替换为一个计数值和单个字符或字节。
这个计数值通常是存储在一个单一的字节或两个字节中。
RLE压缩算法是一种简单而直观的算法,可以实现高速的压缩和解压缩。
RLE压缩算法的压缩过程如下:
1. 首先,扫描整个待压缩的数据文件。
2. 找到连续的相同字节序列,并计算它们的长度。
3. 对于长度小于等于255的连续相同字节序列,使用一个字节来存储长度,后面跟着单个字符。
4. 对于长度大于255的连续相同字节序列,使用两个字节来存储长度,后面跟着单个字符。
5. 如果遇到无法压缩的字节序列,则将其保持不变,并用一个字节来存储序列的长度。
RLE压缩算法的解压缩过程与压缩过程类似,可以轻松地还原出原始数据文件。
在解压缩时,只需要读取压缩文件中的每个字节,如果该字节表示长度,则读取后面的字符指定的次数,否则直接复制该字节到输出文件中。
由于RLE压缩算法是一种非常简单而高效的压缩技术,因此经常用于嵌入式设备、压缩数据的传输以及压缩数据存储等领域。
RLE 行程长度压缩算法的改进
RLE 行程长度压缩算法的改进分类:VR 2007-05-21 22:54 967人阅读评论(1) 收藏举报计算机所能处理的各种信息都是数字信息。
数字化了的各种信息数据量很大,如果直接使用,肯定会给计算机造成很大负担。
例如,一张A4幅面的图片,若用中等分辨率的扫描仪按真彩扫描,其数据量大约为26MB,这是一个不小数目。
这些大量的数据信息会对存储器的存储容量、通信干线信道的带宽以及计算机的处理速度产生极大的压力,因此必须对这些数据进行压缩。
本文仅就行程长度(RLE)无损压缩算法及其改进方法进行研究。
1行程长度(RLE)压缩算法的基本原理[1]对于图像文件中的各个像素数据,由于图像颜色的梯度变化,相邻像素的颜色值相同的可能性极大,RLE(Run Length Encoding)压缩算法的原理就是将一扫描行中颜色值相同的相邻像素,用一个计数值和那些像素的颜色值来代替。
主要通过压缩除掉数据中的冗余字节或字节中的冗余位,从而达到减少文件所占空间的目的。
例如,有一表示颜色像素值的字符串aaaaaabbccccddddddddeeeeeee,用RLE压缩方法压缩后,可用6a2b3c8d6e来代替,显然后者的串长度比前者的串长度小得多。
但是,当图像像素的颜色值出现特殊情况时,如每个相邻像素的颜色值均不同,则经此方法压缩后,反而会使数据串的长度增加一倍,为了尽量避免前述特殊数据的出现,RLE方法在具体实施时对计数字节和图像像素字节进行了区分,对每个相邻像素的颜色值均不同的单个像素数据,只有当高2位全1时才加1计数,否则直接输出该像素值,因此避免了压缩后长度增加一倍的情况。
这样就使得计数字节本身的高2位也是全1,即计数字节为C0H+n(像素数据连续相同的字节数)。
由于一个字节最大只能为FFH,因此n 最大只能为FFH-C0H=3FH=(63)10,故当n>63时,则需分多次压缩。
当单个图像数据的值大于C0时,先输出C1,再输出该图像数据值,否则直接输出该数据。
rle方法压缩
rle方法压缩一、RLE压缩原理RLE压缩方法基于一个简单的原理:连续重复出现的相同字符可以用一个计数值和该字符来表示。
例如,字符串"AABBBCCCC"可以被压缩为"2A3B4C"。
在这个过程中,原始数据被转换为一个计数值和一个字符的序列,从而减少了存储空间。
二、RLE压缩应用1. 文本压缩:RLE可以用于对文本文件进行压缩,减少存储空间的占用。
特别是对于大量重复出现的字符或字符串,RLE能够显著减少文件的大小。
2. 图像压缩:图像中往往存在大面积相同颜色的区域,RLE可以将这些区域进行压缩,减少图像文件的大小。
同时,在无损压缩的情况下,RLE可以保留图像的细节信息。
3. 音频压缩:RLE可以用于对音频数据进行压缩,减少存储或传输所需的带宽。
在音频文件中,连续相同的采样值可以使用RLE方法来进行压缩。
三、RLE压缩优势1. 简单高效:RLE压缩算法简单易懂,实现起来相对简单,可以快速实现压缩和解压操作。
2. 无损压缩:RLE方法是一种无损压缩方法,可以保证原始数据的完整性,无需担心数据丢失。
3. 适用范围广:RLE适用于各种类型的数据,包括文本、图像、音频等。
无论是处理文本文件,还是压缩图像、音频文件,RLE都能发挥出良好的压缩效果。
四、RLE压缩的局限性1. 压缩率受限:RLE方法在处理无规律、高熵(即信息量大)的数据时,压缩率较低。
因为RLE主要适用于连续出现相同字符的情况,对于随机分布的数据效果不佳。
2. 压缩后文件存储:压缩后的数据需要解压缩才能正常使用,因此需要考虑解压缩的时间和存储空间。
3. 不适合小规模数据:对于小规模的数据,RLE压缩可能会导致压缩后的数据比原始数据还要大,因此不适合小规模数据的压缩。
RLE是一种简单高效的数据压缩方法,适用于各种类型的数据。
它通过统计连续出现的相同字符的个数来减少数据的存储空间。
RLE 方法在文本压缩、图像压缩、音频压缩等领域都有广泛的应用,并具有无损压缩、适用范围广的优势。
C#压缩或解压rar、zip文件方法实例
C#压缩或解压rar、zip⽂件⽅法实例前⾔为了便于⽂件在⽹络中的传输和保存,通常将⽂件进⾏压缩操作,常⽤的压缩格式有rar、zip和7z,本⽂将介绍在C#中如何对这⼏种类型的⽂件进⾏压缩和解压,并提供⼀些在C#中解压缩⽂件的开源库。
在C#.NET中压缩解压rar⽂件rar格式是⼀种具有专利⽂件的压缩格式,是⼀种商业压缩格式,不开源,对解码算法是公开的,但压缩算法是私有的,需要付费,如果需要在您的商业软件中使⽤rar格式进⾏解压缩,那么你需要为rar付费,rar在国内很流⾏是由于盗版的存在,正因为算法是不开源的,所以我们压缩rar并没有第三⽅的开源库可供选择,只能另寻出路。
针对rar的解压缩,我们通常使⽤winrar,⼏乎每台机器都安装了winrar,对于普通⽤户来说它提供基于⽤户界⾯的解压缩⽅式,另外,它也提供基于命令⾏的解压缩⽅式,这为我们在程序中解压缩rar格式提供了⼀个⼊⼝,我们可以在C#程序中调⽤rar的命令⾏程序实现解压缩,思路是这样的:1、判断注册表确认⽤户机器是否安装winrar程序,如果安装取回winrar安装⽬录。
2、创建⼀个命令⾏执⾏进程。
3、通过winrar的命令⾏参数实现解压缩。
⾸先我们通过下⾯的代码判断⽤户计算机是否安装了winrar压缩⼯具:如果已经安装winrar可通过如下代码返回winrar的安装位置,未安装则返回空字符串,最后并关闭注册表:public static string ExistsWinRar(){string result = string.Empty;string key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(key);if (registryKey != null){result = registryKey.GetValue("").ToString();}registryKey.Close();return result;}/// <summary>/// 将格式为rar的压缩⽂件解压到指定的⽬录/// </summary>/// <param name="rarFileName">要解压rar⽂件的路径</param>/// <param name="saveDir">解压后要保存到的⽬录</param>public static void DeCompressRar(string rarFileName, string saveDir){string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(regKey);string winrarPath = registryKey.GetValue("").ToString();registryKey.Close();string winrarDir = System.IO.Path.GetDirectoryName(winrarPath);String commandOptions = string.Format("x {0} {1} -y", rarFileName, saveDir);ProcessStartInfo processStartInfo = new ProcessStartInfo();processStartInfo.FileName = bine(winrarDir, "rar.exe");processStartInfo.Arguments = commandOptions;processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;Process process = new Process();process.StartInfo = processStartInfo;process.Start();process.WaitForExit();process.Close();}/// <summary>/// 将⽬录和⽂件压缩为rar格式并保存到指定的⽬录/// </summary>/// <param name="soruceDir">要压缩的⽂件夹⽬录</param>/// <param name="rarFileName">压缩后的rar保存路径</param>public static void CompressRar(string soruceDir, string rarFileName){string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe";RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(regKey);string winrarPath = registryKey.GetValue("").ToString();registryKey.Close();string winrarDir = System.IO.Path.GetDirectoryName(winrarPath);String commandOptions = string.Format("a {0} {1} -r", rarFileName, soruceDir);ProcessStartInfo processStartInfo = new ProcessStartInfo();processStartInfo.FileName = bine(winrarDir, "rar.exe");processStartInfo.Arguments = commandOptions;processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;Process process = new Process();process.StartInfo = processStartInfo;process.Start();process.WaitForExit();process.Close();}在C#.NET中压缩解压zip⽂件zip是⼀种免费开源的压缩格式,windows平台⾃带zip压缩和解压⼯具,由于算法是开源的,所以基于zip的解压缩开源库也很多,SharpZipLib是⼀个很不错的C#库,它能够解压缩zip、gzip和tar格式的⽂件,⾸先下载SharpZipLib解压后,在您的项⽬中引⽤ICSharpCode.SharpZLib.dll程序集即可,下⾯是⼀些关于SharpZipLib压缩和解压的⽰例。
rar解压算法
rar解压算法RAR解压算法是一种用于解压缩RAR文件的算法。
RAR文件是一种非常常见的压缩文件格式,经常用于将大量文件或文件夹压缩成一个单一的文件,以便于传输或存储。
RAR解压算法的作用就是将这些压缩过的文件进行解压缩,恢复到原始的文件或文件夹状态。
RAR文件压缩算法采用了一系列的数据压缩技术,其中最关键的是字典压缩。
字典压缩是一种基于字典的压缩方法,通过维护一个字典表,将重复出现的数据块替换为更短的标记,从而达到压缩数据的目的。
RAR解压算法中的字典压缩使用了一种称为LZSS(Lempel-Ziv-Storer-Szymanski)的算法。
LZSS算法是一种经典的无损压缩算法,它的核心思想是利用历史数据来寻找重复的模式,并将其替换为较短的标记。
在RAR解压算法中,LZSS算法使用了滑动窗口和查找缓冲区来寻找重复的模式。
滑动窗口是一个固定大小的缓冲区,用于存储历史数据。
查找缓冲区是滑动窗口的子集,用于存储当前正在处理的数据。
算法从查找缓冲区中选择一个最长的匹配串,将其替换为标记,并将匹配串后的数据移动到滑动窗口中。
除了字典压缩外,RAR解压算法还使用了Huffman编码和位模式编码来进一步压缩数据。
Huffman编码是一种变长编码方法,通过为不同的数据块分配不同长度的编码,使得出现频率高的数据块具有较短的编码长度,从而进一步减小数据的大小。
位模式编码则是一种基于位操作的编码方法,通过将数据块表示为位模式,并使用位操作来高效地进行解压缩。
RAR解压算法的核心思想是在保证数据完整性的前提下,尽可能地减小数据的大小。
通过采用字典压缩、Huffman编码和位模式编码等多种压缩技术的组合,RAR解压算法能够在保证解压缩过程的高效性的同时,显著减小数据的大小。
总结一下,RAR解压算法是一种用于解压缩RAR文件的算法,它采用了字典压缩、Huffman编码和位模式编码等多种压缩技术的组合。
通过这些技术,RAR解压算法能够在保证数据完整性和解压缩效率的前提下,显著减小数据的大小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《C语言课程设计》实验报告
一、问题描述
题目4:RLE压缩解压算法
涉及知识点:文件读写、位操作、内存管理、结构体定义、RLE算法、命令行参数
要求:编写一个程序,可以在命令行输入参数,完成指定文件的压缩解压命令行参数如下
rle file1 –c(-d) file2
第一个参数为可执行程序名称,第二个参数为原始文件名,第三个参数为压缩或解压缩选项,第四个参数为新文件名
说明:
通过该练习,学生需要掌握:
(1)文件操作
(2)位操作
(3)RLE算法(相关算法可以查阅资料,我们这里要求数据都是1个字节作为单位长度的)
二、技术关键点分析
1.读取原始文件
FILE* f1;
FILE* f2;
f1 = fopen(argv[1], "rb");
if(f1 == NULL){
printf("找不到这文件!\n");
return0;
}
int t = 0;
int a = 0;
//读取文件
while ((a = fgetc(f1)) != EOF) {
file_src[t++] = a;
}
f2 = fopen(argv[3], "wb");
int size = t;
printf("输入字符数%d",size);
2.选择解码还是编码
if( strcmp(argv[2], "-d") == 0){
size = RLEdecode(file_src, size, file_dst, MAX_CHAR);
printf("输出字符数%d",size);
}else if(strcmp(argv[2], "-e") == 0){
size = RLEencode(file_src, size, file_dst, MAX_CHAR);
printf("输出字符数%d",size);
}
3(1)解码
//RLE 解码算法,正好是编码算法的反过程
int RLEdecode(unsigned char* src,int src_len,unsigned char* dst,int dst_len)
{
unsigned char *data = src;
int left = src_len;
int point = 0;//输出缓冲区指针
while(data < src + src_len)
{
unsigned char zifu = *data++;
int count = zifu & 0x7f;
//请注意,一定要注意,这里是巨大bug易发生地,因为==的优先级其实比&要高,一定要加括号,一定要注意
if((zifu&0x80)==0x80)//是重复字符
{
for(int i=0;i<count;i++)
{
dst[point++] = *data;
}
data++;
}else
{
for(int i=0;i<count;i++)
{
dst[point++] = *data++;
}
}
}
return point;
}
3(2)编码
//RLE算法,编码,输入参数为源数组,源数组长度,目标数组,目标数组长度int RLEencode(unsigned char* src,int src_len,unsigned char* dst,int dst_len)
{
unsigned char *data = src;
int left = src_len;
int point = 0;//输出缓冲区指针
while(left > 0)
{
int count = 0;
if(Isrepeat(data,left))
{
count =getrepeatlength(data,left);
dst[point++] = count|0x80;//写重复数据的数据量
dst[point++] = *data;//写字符
//指针移动
data+=count;
left-=count;
}
else{
count =getnorepeatlength(data,left);
dst[point++] = count;
for(int i=0;i<count;i++)
{
dst[point++] = *data;
data++;
}
left-=count;
}
}
return point;
}
int Isrepeat(unsigned char* src,int left)
{
if(left<3)////判断是否是重复数据,注意,只有重复数据大于3的时候才被判定为i重复数据
{
return0;
}
if(src[0] == src[1]&&src[1] == src[2])
{
return1;
}
return0;
}
//获得重复数据的长度
int getrepeatlength(unsigned char* src,int left)
{
unsigned char data = src[0];
int len = 1;
while(len<left&&len<127&&src[len] == data)
{
len++;
}
return len;
}
//获得不重复数据的长度
int getnorepeatlength(unsigned char* src,int left)
{
if(left < 3)
return left;
//不重复数据的长度至少为2
int len = 2;
//first和second代表前后两个字符,不断向后移动
unsigned char first = src[0];
unsigned char second = src[1];
while(len<left&&len<127)
{
if(!(first==second&&src[len]==second))
{
first = second;
second = src[len];
len++;
}
else
{
break;
}
}
return len;
}
4.关闭文件
fwrite(file_dst, size, sizeof(unsigned char), f2);
fclose(f1);
fclose(f2);
三、流程图
四、测试与分析
解压缩。