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