【发布时间】:2019-09-29 14:26:47
【问题描述】:
我有一个无法修改的文件,它由 3 个串联的 zlib 数据组成。
数据不是很大(几百千字节)
我怎样才能阅读它们?有 Qt 函数qUncompress()(已编辑),但它需要一个长度作为参数,我不知道流的实际长度是多少。
解决方案 1: 通过流读取数据时,我看到的用于读取数据块的代码并在遇到错误时停止。问题是当“读取固定的数据块”将消耗该块时,如果流的大小不完全是 N 的倍数,则流将被破坏。
伪代码:
while (no error) {
read N bytes
decompress_next(these N bytes)
}
... Here there may be up to N-1 totally skipped bytes...
它在 N=1 时有效,但我觉得有点骇人听闻。有更好的选择吗?
解决方案 2: 解压缩流,再次压缩并获取第一个块的大小。转到偏移量然后读取等...(当输入流不可写但它应该适用于我的情况时,它应该不适用)
如果代码不平凡,我最终可以使用 c 或 c++ 库(理想情况下是轻量级的)。
这可能是不可能的,我对 zlib 算法了解不多,如果它知道流何时结束或只是读取“无状态”数据。
编辑:实用程序 zlib-flate 看起来像是为解决方案 #2 做的,所以这显然是可能的
【问题讨论】: