使用zlib将字节数组解压缩为字节数组

问题描述 投票:0回答:2

上下文:我正在使用 .mbtiles 文件,这是一种地理映射文件格式,它是一个包含矢量切片的 sqlite 数据库文件。

这些矢量切片使用协议缓冲区进行打包,然后进行 gzip 压缩。

我正在使用C++,当前正在阅读zlib使用解压缩示例,但我不确定如何处理块和流事件结束。

SQLite 给了我一个 void* 指针和一个长度。

我引用该页面:

对于 zlib 流嵌入其他数据的应用程序,这 例程需要修改以返回未使用的数据,或者在 最少表明有多少输入数据未被使用,因此 应用程序会知道在 zlib 流之后从哪里获取。

protocol buffer 类方法采用 void* 或 std::string。我想我应该选择 void*。

我不确定这些事件是如何工作的,并且该示例似乎没有提供字节数组的情况。我应该如何更改代码以避免错误?

c++ sqlite gzip zlib inflate
2个回答
1
投票

听起来 SQLite 为您提供了一个 zlib 流,后面没有任何内容。如果是这样,那么该评论不适用。

无论如何,您正在查看正确的页面。 (你没有说“页面”是什么,但我认得这句话,因为我写了它。)这通常显示了如何使用 zlib 函数。您应该能够弄清楚如何将其应用于字节数组而不是文件输入。

如果数据确实是“gzipped”的,那么您将需要使用

inflateInit2()
而不是
inflateInit()
。阅读 zlib.h 中的 zlib 文档。


0
投票
特别针对 MBTiles 用例(作为我在

Martin Tile Server 上的 Rust 工作的一部分,我最近创建了一个 sqlite-compressions,它将 gzip

brotli
 压缩、解压缩和测试功能添加到 sqlite 作为可加载扩展(或者您可以直接从 Rust 代码中使用它)。另外还有另一个扩展中的许多哈希函数。

这将允许您使用 SQL 获取未压缩的数据,而无需在代码中处理它:

  • SELECT gzip_decode(tile_data) FROM tiles WHERE ...
    
    
© www.soinside.com 2019 - 2024. All rights reserved.