小伙伴们关心的问题:什么是压缩算法,或者压缩算法分类的知识,本文通过数据整理汇集相关信息,希望对各位有所帮助。
本文目录一览:
压缩文件的算法
主要是看文件格式,像rmvb等格式都是已经压缩过的了,再压空间不大,还有就是独立格式文件,一般系统无法识别,并且文件名比较怪的都是别人独立开发的格式,这些也没什么压缩空间,算法你要看那格式种了,系统常见的文件压缩算法都是
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]^(c8),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
结束循环
[img]压缩方法有哪些?各有什么优缺点,压缩比是多少呢?主要是在linux下代码压缩的?rar或zip大部分都是win下
压缩比率很难说,未压缩数据的复杂程度会影响这个比率。
常见压缩算法按压缩比率由大到小排:
paq系 lzma系 rar bzip2 lz系(gz、zip) lzo
paq相当费时而且耗内存,有点不值得使用;lzma是目前硬件水平可接受的高压缩比算法(7z就属于此类洐生品);rar没什么好说的,商业算法,我觉得比bzip2费时上还好点;lzo虽然压缩比率不那么历害,但高速、内存需求极少是其亮点,在需要实时压缩、解压的场合非常受欢迎,例如网络通迅、数据库。
linux中最常用tar.gz格式(winrar支持解压)。
命令通常是这样: tar czvf abc.tar.gz name1 name2 ...
解释一下参数czvf
c 建立
v 详细信息
f 输出文件,后面一定跟生成的压缩文件名。
z 用gz压缩
(其它压缩还有:
Z compress压缩,几乎没人用的老旧lz算法
j bzip2压缩
J xz压缩,lzma的改进算法
也可在最后加参数 --lzop 或 --lzip 或 --lzma)
生成tar.gz其实经过两个处理过程的,首先tar将所有文件的信息 *** 成一个无压缩的tar格式(无需写到磁盘),再用gz压缩算法处理(很像rar的solid选项)。这样的坏处是,如果你只要解压其中一个文件,解压时也要读取压缩文件前面很大部分内容。
压缩算法
#includestdio.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;i32;i++){
if(a[i]==a[i+1]a[i]==a[i+2])
printf("2 ");
else
printf("1 ");
}
}
总结:什么是压缩算法和压缩算法分类的介绍到此就结束了,感谢您的支持。