我目前正在尝试使用zlib来扩充压缩数据源。
zlib 中的膨胀 API 似乎无法膨胀压缩数据(示例http://www.zlib.net/zpipe.c无法读取压缩文件:“zpipe:无效或不完整的压缩数据”)。我注意到这个 API 中有一个gzopen函数,但是,据我了解,它只适用于文件名或文件描述符。
如果我的压缩数据源存储在内存、sql blob 等中,我可以使用这个 API 吗?
非常感谢
皮埃尔
您可以使用该函数将内存位置作为文件打开fmemopen
,然后将该文件描述符传递给 gzopen 函数。
gzip 格式只是向 zlib 压缩流添加了一个简单的标头(和预告片)。跳过标题并不困难。该格式记录在RFC 1952中。
作为另一种解决方案,有gzdopen
- 它采用文件描述符。您可以获得一个用于读取内存的pipe()
. 然后,您可以使用某种形式的非阻塞文件描述符或辅助线程来读取数据。
您可能会发现这比它的价值更麻烦:Matthew Slattery 的解决方案很可能更可行。
zlib.h 有一个用于解压缩/压缩内存中数据缓冲区的 API,inflateInit2() 允许您将 16 添加到推荐的 windowBits 值 15 以解压缩 gzipped 数据缓冲区。不幸的是,没有 API 可以从 8 字节 gzip 预告片中读取预期的解压缩字节数(4 字节 Fletcher-32 CRC,4 字节大小的解压缩数据,以字节为单位)。据我所知,您必须自己执行此操作,或者进行猜测,然后如果 inflate() 返回 Z_BUF_ERROR (传入的输出缓冲区中没有足够的空间),则调整输出缓冲区的大小。如果内存中有整个输入缓冲区,请使用 Z_FINISH 刷新标志来 inflate()。如果您有足够的输出内存,它将返回 Z_STREAM_END,如果没有,则返回 Z_BUF_ERROR,您可以重新分配输出缓冲区并继续。