当前位置:首页 » 文件管理 » 压缩算法

压缩算法

发布时间: 2022-02-13 12:05:56

A. 压缩算法

#include<stdio.h>
main(){
int i,a[34]={1,4,6,8,9,3,0,0,8,5,3,3,3,4,7,1,1,1,1,1,0,1,7,7,7,7,7,7,7,7,5,5,6,6};
for(i=0;i<32;i++){
if(a[i]==a[i+1]&&a[i]==a[i+2])
printf("2 ");
else
printf("1 ");
}
}

B. 压缩标准就是压缩算法吗

非也。标准是规范,算法是在规范内解决问题的方法。比如H.264视频压缩标准有很多算法。还有,JPEG 2000图像压缩标准下有很多编码算法,比如小波分析 ,EZW、SPIHT、EBCOT等编码算法。

C. 无损压缩算法是什么样的

WinRAR是采用它自己的独创的压缩算法。
【希望你能看看最优二叉树(哈夫曼树),理解哈夫曼编码的原理,对你的这个压缩算法会有很明晰的指导和解惑作用】WinRAR是采用它自己的独创的压缩算法。

压缩处理都是以二进制的方式进行的。这和你的编码有关。只要是处理后的结果比原文档文件小,而且是可逆的还原,就是无压缩。
压缩率的大小和你的编码方式有关。

无损压缩是指重构压缩数据(还原,解压缩),而重构数据与原来数据完全相同。该方法用于那些要求重构信号与原始信号完全一致的场合,如文本数据、程序和特殊应用场合的图像数据(如指纹图像、医学图像等)的压缩。这类算法压缩率较低,一般为1/2~1/5。典型的无损压缩算法有:Shanno-Fano编码、Huffman(哈夫曼)编码、算术编码、游程编码、LZW编码等。

基于哈夫曼编码原理的压缩算法:
哈夫曼算法的过程为:统计原始数据中各字符出现的频率;所有字符按频率降序排列;
比如有一个字符串:aaaaaaaaaabbbbbbcccd
原文件大小存储需要20个字节。如果按频率出现的次数高低,给予字符串中的每个字符不同的编码长度,就可以达到压缩的目的。

a编码为01(占用2个bit)
b编码为00(占用2个bit)
c编码为000,(占用3个bit)
c编码为001,(占用3个bit)
那就压缩后的总长为(2*10+2*6+3*3+1*3)/8 =5.5个字节。

另外在解码的时候,要告之对方你的编码方式,需要把编码的规则传递过去。

如果对于以上字符串,你也可以按aaaaaaaaaa编码成一个1,bbbbbb为2,ccc为3,d为4。这样压缩后的内容为最小,但是要注意一点,这时你的编码规则为最大,你要把你的编码规则发给对方的时候,有可能编编解码规则文件可能会比压缩后的内容还要大。最终结果为造成压缩后的文件比原文件还要大。

D. 压缩的算法都有哪些

只有最常见的zip的,估计你都要研究上n久了。。。
文本文件一般有zip,rar,
网页文件有htz
视频文件有rm,avi
语音文件有mp3,
图片文件有png,gif,jpg

这些都是文件压缩的。。。。

------------------------------------

ZIP文件的总体格式
分文件头信息+文件压缩数据
中心目录+中心目录记录结束符

1.分文件头信息:
字节数 描述
4 分文件头信息标志(0x04034b50)
2 解压缩所需版本
2 通用比特标志位(置比特0位=加密;置比特1位=使用压
缩方式6,并使用8k变化目录,否则使用4k变化目录;置比特2位=使用压
缩方式6,并使用3个ShannonFano树对变化目录输出编码,否则使用2个
ShannonFano树对变化目录输出编码,其它比特位未用)
2 压缩方式(0=不压缩,1=缩小,2=以压缩因素1缩小,3=以
压缩因素2缩小,4=以压缩因素3缩小,5=以压缩因素4缩小,6=自展)
2 文件最后修改时间
2 文件最后修改日期
4 32位校验码
4 压缩文件大小
4 未压缩文件大小
2 文件名长
2 扩展段长
? 文件名(不定长)
? 扩展段(不定长)

2.中心目录结构
文件头信息...中心目录记录结束符
文件头:
字节数 描述
4 中心文件头信息标志(0x02014b50)
2 主机操作系统(高位字节表示主机操作系统,低位字
节表示ZIP压缩软件版本号,其值除以10表示主版本号,其值模10表示
次版本号。0=MS-DOS,OS/2 FAT文件系统,1=Ami ga,2=VMS,3=Unix及
变种,4=VM/CMS,5=AtariST,6=OS/2 HPFS,7=Macintosh,8=Z-System,9
=C P/M,10-255未用)
2 解压缩所需版本
2 通用比特标志
2 压缩方式
2 文件最后修改时间(用标准的MS-DOS时间日 期格式
编码)
2 文件最后修改日期
4 32位校验码(使用David Schwaderer的CRC-32算法产
生)
4 压缩文件大小
4 未压缩文件大小
2 文件名长
2 扩展段长
2 文件注释长(分别为文件名长,扩展段,注释 段,小于
64K)
2 磁盘起始号(本文件在磁盘中的起始号)
2 内部文件属性(最低位若置1,表示为ASC文本,否则为
二进制数据,其它位未用)
4 外部文件属性(依赖于主机操作系统)
4 分文件头相对位移
? 文件名(不定长)
? 扩展段(不定长,用于未来扩展,低版本为0长)
? 文件注释(不定长)

3.中心目录记录结束符
字节数 描述
4 中心目录标记结束符(0x06054b50)
2 磁盘号(其中包括中心目录结束记录)
2 磁盘中心目录起始号
2 磁盘中心目录入口总数
2 中心目录入口总数(ZIP文件中的文件总数)
2 整个中心目录大小
4 关于起始磁盘号的中心目录初始偏移
2 ZIP文件注释长度
? ZIP文件注释(不定长)

加密方法
PKZIP中使用的加密方法由Roger Schlafly提供。ZIP文件在解压
缩前必须先解密。每个加密文件具有一个12字节的加密文件头扩展信
息,存储于数据区的起始位置,加密前先设置一个起始值,然后被三个3
2位的密钥加密。密钥被使用者提供的口令初始化。12个字节加密之
后,由PKZIP的伪随机数产生方法,结合PKZIP中使用CRC-32算法对密钥
进行更新。
具体实施分为三步:

1.用口令对三个32位密钥初始化。
K(0)=305419896,K(1)=591751049,K(2)=878082192
循环 for i=0 to length(password)-1
调用更新密钥函数 update_keys(password(i))
结束循环(循环口令长度次)
其中更新密钥函数为:
update_keys(char):
Key(0)=crc32(key(0),char)
Key(1)=Key(1)+(Key(0)& 000000ffH)
Key(1)=Key(1)*134775813+1
Key(2)=crc32(Key(2),Key(1)〉〉24)
end update_keys
CRC32函数中,给定一个4字节的CRC值和一个字符,返回一个由CRC
-32算法更新的CRC。具体为:
crc32(c,b)=crc32tab[(c^b)&0xff]^(c>>8),crc32tab[256]的值
为固定的256个4字节数。

2.读取并加密12字节的加密头,再次对密钥进行初始化。
将12个字节的加密头读入缓冲区buffer(0)至buffer(11),循环fo
r i=0 to 11
C=buffer(i)^decrypt_byte()
update_keys(C)
buffer(i)=C
结束循环(循环12次)
其中的decrypt_byte()函数为:
unsigned char decrypt_byte()
local unsigned short temp
temp=Key(2)¦2
decrypt_byte=((temp*(temp^1))>>8)&0xff
end decrypt_byte
该步结束后,缓冲区中最后的二个字节buffer(10)和buffer(11)
将成为加密文件校验码的二个最高位(按低至高顺序存放)。对ZIP加
密文件进行解压缩前,PKUNZIP软件将使用者提供的口令按上述二个步
骤进行处理,得到的结果与校验码的二个高位字节进行比较,只有当提
供了正确的口令时,结果一致,才能进行后续的解压缩过程,否则,PKZI
P报告错误信息,程序自动结束。

3.读取压缩的数据流并以加密密钥对其进行加密。
压缩数据流按下述过程加密:
循环 直至数据流结束
C=数据流的一个字节
temp=C^decrypt_byte()
update_keys(temp)
输出temp
结束循环

E. RAR和ZIP两种格式的压缩算法分别是什么

RAR文件的扩展名是.rar(不区分大小写,),MIME类型是application/x-rar-compressed。同样是无损数据压缩,RAR文件通常比ZIP文件压缩比要高,但是压缩速度较慢。因为RAR文件头也要占据一定空间,在数据压缩余地不大时,压缩过的文件可能比原文件要大。RAR的一个主要优点是可以把文件压缩目标分割到多个文件,并且很容易从这样的分割的压缩文件解压出源文件。另外,RAR也支持紧缩格式,把所有文件压缩到同一个数据区以加大压缩比,代价是解压一个单独的文件时必须解压其前面的所有文件。新的RAR的加密算法使用的是AES,而旧的RAR的加密算法是私有的。这两种算法都很难破解,所以在没有密码的情况下只能用字典暴力破解法来破解。RAR中也可以加入冗余的修复信息,在文件损坏但是修复信息足够完好时可以对压缩包进行修复。

F. 现在的压缩算法有哪些

Gzip压缩算法,Gzip压缩针对冗余度高的数据压缩效果比lzo更好,但对cpu的占用比lzo平均高15%左右,若需要加速连接数相对较少,建议启用gzip。默认使用lzo算法。谢谢您对电信产品的关注,祝您生活愉快。 如果以上信息没有解决您的问题,也可登录广东电信手机商城(http://m.gd.189.cn),向在线客服求助,7X24小时在线喔!

G. 什么是压缩算法

LZW压缩算法的基本概念:LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream)和编译表(String Table)。在编码时,数据流是输入对象(文本文件的据序列),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都须要用借助的对象。字符(Character):最基础的数据元素,在文本文件中就是一个字节,在光栅数据中就是一个像素的颜色在指定的颜色列表中的索引值;字符串(String):由几个连续的字符组成; 前缀(Prefix):也是一个字符串,不过通常用在另一个字符的前面,而且它的长度可以为0;根(Root):一个长度的字符串;编码(Code):一个数字,按照固定长度(编码长度)从编码流中取出,编译表的映射值;图案:一个字符串,按不定长度从数据流中读出,映射到编译表条目. LZW压缩算法的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表.

H. zip 的压缩原理与实现

文件压缩原理

我们使用计算机所做的事情大多都是对文件进行处理。每个文件都会占用一定的磁盘空间,我们希望一些文件,尤其是暂时不用但又比较重要不能删除的文件(如备份文件,有点像鸡肋呀),尽可能少的占用磁盘空间。但是,许多文件的存储格式是比较松散的,这样就浪费了一些宝贵的计算机存储资源。这时,我们可以借助压缩工具解决这个问题,通过对原来的文件进行压缩处理,使之用更少的磁盘空间保存起来,当需要使用时再进行解压缩操作,这样就大大节省了磁盘空间。当你要拷贝许多小文件时,通过压缩处理可以提高执行效率。如果小文件很多,操作系统要执行频繁的文件定位操作,需要花费很多的时间。如果先把这些小文件压缩,变成一个压缩文件后,再拷贝时就很方便了。由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。为了有助于理解文件压缩,请您在脑海里想象一幅蓝天白云的图片。对于成千上万单调重复的蓝色像点而言,与其一个一个定义“蓝、蓝、蓝……”长长的一串颜色,还不如告诉电脑:“从这个位置开始存储1117个蓝色像点”来得简洁,而且还能大大节约存储空间。这是一个非常简单的图像压缩的例子。其实,所有的计算机文件归根结底都是以“1”和“0”的形式存储的,和蓝色像点一样,只要通过合理的数学计算公式,文件的体积都能够被大大压缩以达到“数据无损稠密”的效果。总的来说,压缩可以分为有损和无损压缩两种。如果丢失个别的数据不会造成太大的影响,这时忽略它们是个好主意,这就是有损压缩。有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式mpeg、音乐文件格式mp3和图像文件格式jpg。但是更多情况下压缩数据必须准确无误,人们便设计出了无损压缩格式,比如常见的zip、rar等。压缩软件(compression software)自然就是利用压缩原理压缩数据的工具,压缩后所生成的文件称为压缩包(archive),体积只有原来的几分之一甚至更小。当然,压缩包已经是另一种文件格式了,如果你想使用其中的数据,首先得用压缩软件把数据还原,这个过程称作解压缩。常见的压缩软件有winzip、winrar等

I. 压缩算法原理

哈夫曼
哈夫曼编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。

哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。

2.1 原理
我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。

简短的说,这个问题的解决方案是为了查找每个符号的通用程度,我们建立一个未压缩数据的柱状图;通过递归拆分这个柱状图为两部分来创建一个二叉树,每个递归的一半应该和另一半具有同样的权(权是 ∑ N K =1 符号数 k , N 是分之中符号的数量,符号数 k 是符号 k出现的次数 )

这棵树有两个目的:

1. 编码器使用这棵树来找到每个符号最优的表示方法

2. 解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了。

压缩后的数据流是 24 位(三个字节),原来是 80 位( 10 个字节)。当然,我应该存储哈夫曼树,这样解码器就能够解码出对应的压缩流了,这就使得该例子中的真正数据流比输入的流数据量大。这是相对较短的数据上的副作用。对于大数据量来说,上面的哈夫曼树就不占太多比例了。

解码的时候,从上到下遍历树,为压缩的流选择从左 / 右分支,每次碰到一个叶子节点的时候,就可以将对应的字节写到解压输出流中,然后再从根开始遍历。

2.2 实现
哈夫曼编码器可以在基本压缩库中找到,其是非常直接的实现。

这个实现的基本缺陷是:

1. 慢位流实现

2. 相当慢的解码(比编码慢)

3. 最大的树深度是 32 (编码器在任何超过 32 位大小的时候退出)。如果我不是搞错的话,这是不可能的,除非输出的数据大于 2 32字节。

另一方面,这个实现有几个优点:

1. 哈夫曼树以一个紧密的形式每个符号要求 12 位(对于 8 位的符号)的方式存储,这意味着最大的头为 384 。

2. 编码相当容易理解

哈夫曼编码在数据有噪音的情况(不是有规律的,例如 RLE )下非常好,这中情况下大多数基于字典方式的编码器都有问题。

J. 介绍几种压缩算法并做对比

首先说:这是我自己写的,我拒绝抄别人的。
我很喜欢压缩,7z是一个不错的压缩软件。
首先说说7z后缀格式的这些东西,有LZMA LZMA2 PPMd BZIP2比你要知道的还多了一个。
首先说LZMA,很不错,他对压缩文件很优秀。建议使用。
PPMd,他的压缩率并不高,但是他压缩文档可超出了LZMA,文档指的是记事本一类文字保存文件。
BZIP2,他,没有前面那两位功能强大,但是32位和64位系统都兼容。
忘了说LZMA2了,他,真让我失望。假如你的CPU是4核的,那么你用4线程压缩就会快一倍,但是那时你的CPU占用率就达100%了
说完了

热点内容
劳拉与马ftp 发布:2024-10-25 00:21:16 浏览:359
夺宝网站源码 发布:2024-10-25 00:19:02 浏览:454
编程文本编辑器 发布:2024-10-25 00:09:28 浏览:972
编程徐帅 发布:2024-10-25 00:03:25 浏览:307
手机安卓模拟器如何打开文件 发布:2024-10-25 00:02:55 浏览:722
pythonday 发布:2024-10-24 23:55:47 浏览:425
g编译c文件 发布:2024-10-24 23:55:03 浏览:294
电信上传速度限制破解 发布:2024-10-24 23:44:17 浏览:453
战地五为什么连接不了服务器 发布:2024-10-24 23:37:36 浏览:485
安卓如何下载国外网站 发布:2024-10-24 23:30:35 浏览:137