用zlib解压gzip,在解压缩之前,如何知道压缩前有多大?

starwalker 2009-08-02 08:22:48
用zlib的uncompress解压缩,需要事先分配内存。
但是不知道压缩前有多大,只能先分配很大的内存,比较浪费。
如何能在解压缩之前先知道压缩前的内容有多大?
...全文
2014 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxjjs 2009-08-06
  • 打赏
  • 举报
回复
很肯定的说,没有办法,你可以上zlib的官方网站去看他们的文档:

int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the uncompressed buffer.

也就是说是使用者的责任来保存压缩前的大小。
如果是在自己的应用中使用,建议你在压缩时可以在数据头加上源大小。
如果你是用来打开gz文件,又担心浪费内存,可以用gzopen,然后用gzread来一段段地读。
starwalker 2009-08-05
  • 打赏
  • 举报
回复
没人知道??
starwalker 2009-08-02
  • 打赏
  • 举报
回复
zlib代码比较多,不方便改。
starwalker 2009-08-02
  • 打赏
  • 举报
回复
呵呵,如果能google出来,我就不上这里问了……
  • 打赏
  • 举报
回复
额,对不起,我囧了,我没有用过

这也是别人说的。嗯。都是google出来的。

int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR。




[Quote=引用 2 楼 starwalker 的回复:]
楼上的,这个是在压缩前计算压缩后的长度
我是想在解压缩前知道解压缩后(也就是压缩前)的长度
[/Quote]
starwalker 2009-08-02
  • 打赏
  • 举报
回复
楼上的,这个是在压缩前计算压缩后的长度
我是想在解压缩前知道解压缩后(也就是压缩前)的长度
  • 打赏
  • 举报
回复
里面有你要的答案。。
http://tech.ddvip.com/2008-09/122058025360559.html

看一下这个函数
(3) uLong compressBound (uLong sourceLen);
  计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度

fireseed 2009-08-02
  • 打赏
  • 举报
回复
为什么不用链表数据结构能?动态申请内存。可能需要改一下底层的数据结构。

参考STL的方式,用一个allocator解决内存管理的泛化

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧