导航:首页 > 文件处理 > zlib压缩格式

zlib压缩格式

发布时间:2023-05-30 11:35:01

A. zlib库可以解压rar压缩包吗

1准备工作。下载zlib.dll。以及相关头文件。将dll文件及头文件加入工程。2压清高缩:调用函数compress.形式为intcompress(Byte*dest,uLong*destLen,constByte*source,ULONGsourceLen);功能是将source指向的空晌正唯间,长度为sourceLen的数据进行宴培压缩,压缩数据储存在dest中,长度由参数destLen返回。如果压缩出错,返回对应错误号,否则返回0.3解压缩:调用函数uncompress.形式为intuncompress(Byte*dest,uLong*destLen,constByte*source,ULONGsourceLen);功能是将source指向的空间,长度为sourceLen的数据进行解压缩,解压缩后的数据储存在dest中,长度由参数destLen返回。如果解压缩出错,返回对应错误号,否则返回0.

B. VC++: 如何用zlib实现对 baby.text压缩成baby.tar.gz格式和 baby.tar.gz解压缩还原成 baby.text

你可以用一厅晌薯下3个函数解决:
(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
把源缓冲压缩成目的缓冲。
(2) uLong compressBound (uLong sourceLen);
计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据扮者压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度
(3) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
解压缩。
只要用以上3个函数就可谨掘以解决楼主问题了。

~直击主题,帮人帮己~

C. 如何发挥zlib压缩解压的最大效

首先说明,这里不是横向比较zlib与别的引擎(rar,leo,powerarc...),是探索如何发挥zlib压缩/解压的最大效率。
先看看如下代码在效率上的差异:
var MS:TMemoryStream;(1):begin MS:=TMemoryStream.Create; MS.Size:=$400000;//4M------------------------------------------------(2):var i:integer;begin MS:=TMemoryStream.Create; for i:=1 to 1024 do MS.Size:=MS.Size+4096;

你会发现,方法(1)只要1个毫秒,方法(2)却要20秒。
因此,如果把解压缩程序写成下面这样,会非常没有效率:
procere ZlibDeCompress(instream,outStream:TStream);var ACS:TDeCompressionStream; buf:array[1..4096] of byte; numread:integer;begin inStream.Position:=0; ACS:=TDeCompressionStream.Create(inStream); try repeat numRead:=ACS.Read(buf,sizeof(buf)); if numread>0 then outStream.Write(buf,numRead); until (numRead=0); finally ACS.Free; end;end;

如果我们知道原始资料的大小,一次确定outStream.Size,效率就可以提高几十倍。方法很简单,我们可以在压缩时,把原始资料的Size写在压缩Stream的头部,如,写一个LongWord的大小,解压时就可以先读出Size,因此,最有效率的解压程序为:
procere ZlibDecompressStream2(Source,Dest:TMemoryStream);var zstream: TZStreamRec; SourceLen,DestLen:LongWord;begin FillChar(zstream,SizeOf(TZStreamRec),0); SourceLen:=Source.Size; Source.Position:=0; Source.Read(DestLen,SizeOf(LongWord)); Dest.Size:=DestLen; zstream.next_in:=Pointer(LongWord(Source.Memory)+SizeOf(LongWord)); zstream.avail_in:=SourceLen-SizeOf(LongWord); zstream.next_out:=Dest.Memory; zstream.avail_out:=DestLen; ZDecompressCheck(InflateInit(zstream)); try ZDecompressCheck(inflate(zstream,Z_NO_FLUSH)); finally ZDecompressCheck(inflateEnd(zstream)); end;end;

用一个4M的文件试试,效率提高近70倍。
同样道理,在压缩的时候,如果能预先知道压缩后的大小,也能提高效率不少,但这似乎是不可能的,也不能盲目的给outStream.Size一个"足够大"的数值,只能按引擎的原理估算一个最接近的数值,zlib推荐的为:
((SourceLen+(SourceLen div 10)+12)+255) and not 255
因此,最有效率的压缩程序为:
procere ZlibCompressStream2(Source,Dest:TMemoryStream; CompressLevel:TZCompressi);var zstream: TZStreamRec; SourceLen,DestLen:LongWord;begin FillChar(zstream,SizeOf(TZStreamRec),0); SourceLen:=Source.Size; DestLen:=SizeOf(LongWord)+((SourceLen+(SourceLen div 10)+12)+255) and not 255; Dest.Size:=DestLen; Dest.Position:=0; Dest.Write(SourceLen,Sizeof(LongWord)); zstream.next_in:=Source.Memory; zstream.avail_in:=SourceLen; zstream.next_out:=Pointer(LongWord(Dest.Memory)+SizeOf(LongWord)); zstream.avail_out:=DestLen-SizeOf(longWord); ZCompressCheck(DeflateInit(zstream,ZLevels[CompressLevel])); try ZCompressCheck(deflate(zstream,Z_FINISH)); finally ZCompressCheck(deflateEnd(zstream)); end; Dest.Size:=zstream.total_out+SizeOf(LongWord);end;

D. 怎么用zlib生成标准zip压缩文件和解压缩zip文件

你用的是什么压缩软件?7-Zip? rar是Winrar的私有格式,其它压缩软件通常只能打开和解压缩,而不能生成(否则必须得到Winrar的授权)。 其它你用7z格式就可以了,Winrar等都可以打开7z(7-Zip是开源软件)。你发给别人7z格式,他不论装什么压缩.

E. Java 怎么解压zlib函数库压缩的tar.gz格式的文件

这个文件不是在windows环境下解压的,它是在linux系统下的压缩文件。你应该解压zip格式的压缩包

F. zip、bzip、lzma和ZLib如果极限压缩的话,那种压缩率最高除这几种之外,还有没有压缩率更高的压缩方式

LZMA和ZLIB压缩测试:
输出结果:
zlib压缩:255ms size:5.08MB
zlib解压:12ms
lzma压缩:1974ms size:5.11MB
lzma解压:399ms
LZMA.AS解压:27381ms
这结果真让人大失所望,不知道是不是测试的有问题,没有更小,反而更大了。而且解压时间长了几十倍。as版的LZMA解压时间更是无法接受。还是继续用zlib吧。

ZLIB最高

G. 我要使用zlib库压缩文件,例如word文档,png图片等,那要用哪一个函数呢compress函数只能压缩里面的内容!

如耐腊果喊链有足够的缓存,可以一次昌渗滑性地压缩整个文件,这时候使用compress()压缩,如果缓存比较小,使用defalate()函数在循环里面压缩.

H. 数据流压缩原理和数据压缩Zlib的实现

压缩的本质就是去冗余,去除信息冗余,使用最短的编码保存最完整的数据信息。所以对于不同的场景,压缩采用的算法也因时制宜,比如视频和图片可以采用有损压缩,而文本数据采用无损压缩。压缩率又取决于信息的冗余度,也就是内容中重复的比例。那些均匀分布的随机字符串,压缩率会降到最低,即香农限

deflate是zip文件的默认算法。它更是一种数据流压缩算法。

LZ77压缩算法采用字典的方式进行压缩,是一种简单但是很高效的数据压缩算法。其方式就是把数据中一些可以组织成短语的字符加入字典。维护三个概念: 短语字典、滑动窗口、向前缓冲区

压缩的逆过程,通过解码标记和保持滑动窗口中的符号来更新解压数据。当解码字符被标记:将标记编码成字符拷贝到滑动窗口中,一步一步直到全部翻译完成

在流式传输中,不定长编码数据的解码想要保持唯一性,必须满足唯一可以码的条件。而异前缀码就是一种唯一可译码的候选,当然这样会增加编码的长度,却可以简化解码。

huffman编码是一种基于概率分布的贪心策略最优前缀码。huffman编码可以有效的压缩数据,压缩率取决于数据本身的信息冗余度

计算数据中各符号出现的概率,根据概率从小到大,从下往上反向构建构造码树,这样最终得到的编码的平均长度是最短的。同时也是唯一可译的

解读:在一开始,每一个字符已经按照出现概率的大小排好顺序,在后续的步骤中,每一次将概率最低的两棵树合并,然后用合并后的结果再次排序(为了找出最小的两棵树)。在gzip源码中并没有专门去排序,而是使用专门的数据结构(比如最小堆或者红黑树)。

使用优先队列实现huffman树,最后基于Huffman树最终实现文件压缩。
具体步骤:

gzip = gzip 头 + deflate 编码的实际内容 + gzip 尾

zlib = zlib 头 + deflate 编码的实际内容 + zlib 尾

压缩之前:初始化各种输入输出缓冲区;
压缩:我们可以不断往这些缓冲区中填充内容,然后由deflate函数进行压缩或者indeflate函数进行解压

总结:在调用deflate函数之前,应用程序必须保证至少一个动作被执行(avail_in或者avail_out被设置),用提供更多数据或者消耗更多的数据的方式。avail_out在函数调用之前千万不能为零。应用程序可以随时消耗被压缩的输出数据

I. C++语言怎么用zlib库来解压.ISO或.zip文件

下面是使用zlib库的压缩和解压缩演示代码:

#include <stdlib.h>
#include <stdio.h>
#include <zlib.h>
int main(int argc, char* argv[])
{
FILE* file;
uLong flen;
unsigned char* fbuf = NULL;
uLong clen;
unsigned char* cbuf = NULL;
/* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */
if(argc < 3)
{
printf("Usage: zcdemo srcfile dstfile\n");
return -1;
}
if((file = fopen(argv[1], "rb")) == NULL)
{
printf("Can\'t open %s!\n", argv[1]);
return -1;
}
/* 装载源文件数据到缓冲区 */
fseek(file, 0L, SEEK_END);    /* 跳到文件末尾 */
flen = ftell(file);        /* 获取文件长度 */
fseek(file, 0L, SEEK_SET);
if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL)
{
printf("No enough memory!\n");
fclose(file);
return -1;
}
fread(fbuf, sizeof(unsigned char), flen, file);
/* 压缩数据 */
clen = compressBound(flen);
if((cbuf = (unsigned char*)malloc(sizeof(unsigned char) * clen)) == NULL)
{
printf("No enough memory!\n");
fclose(file);
return -1;
}
if(compress(cbuf, &clen, fbuf, flen) != Z_OK)
{
printf("Compress %s failed!\n", argv[1]);
return -1;
}
fclose(file);
if((file = fopen(argv[2], "wb")) == NULL)
{
printf("Can\'t create %s!\n", argv[2]);
return -1;
}
/* 保存压缩后的数据到目标文件 */
fwrite(&flen, sizeof(uLong), 1, file);    /* 写入源文件长度 */
fwrite(&clen, sizeof(uLong), 1, file);    /* 写入目标数据长度 */
fwrite(cbuf, sizeof(unsigned char), clen, file);
fclose(file);
free(fbuf);
free(cbuf);
return 0;
}

J. 关于zlib解压缩问题,应该是zlib压缩的吧,对压缩不是很懂

1.不是gzip格式,0x1f8b,31,139头不对
2.不是zlib格式
0 1 +---+---+
|CMF|FLG| (more-->)
+---+---+

incorrect header check
3.LZ自己检查是不是纯DEFLATE格式的数据吧,格式如下
|BFINAL| BTYPE | 数……据|
 BFINAL:1bit位。
0 - 还有后续子块;
1 - 该子块是最后一块。
 BTYPE:2bit位。
00 - 不压缩;
01 - 静态Huffman编码压缩;
10 - 动态Huffman编码压缩;
11 - 保留。

阅读全文

与zlib压缩格式相关的资料

热点内容
单片机中断时入口地址作用 浏览:140
程序员的工作是重复性的吗 浏览:63
照片怎么转换成pdf 浏览:131
女生学编程好吗 浏览:240
目前绝地求生怎么看服务器地址大全 浏览:825
论人类不平等的起源pdf 浏览:436
压缩机螺杆加工 浏览:368
怎么把网站服务器设置在境外 浏览:162
单片机编程取反 浏览:897
51单片机课程设计课题 浏览:900
手机淘宝登录怎么加密码 浏览:486
linux快捷方式图标 浏览:38
阳光车险的app叫什么名字 浏览:462
购买单片机的器件时需要给商家啥 浏览:535
并行编译技术的发展 浏览:550
阿里云服务器安装管理 浏览:551
java手机开发教程 浏览:675
我的世界怎么删除服务器数据 浏览:672
linux内存子系统 浏览:973
加密思维币 浏览:691