重建 zlib 流

Reconstructing zlib stream

我的项目包含一个只能单向通信的 Sender/Receiver 框架,没有从接收方到发送方的 return 通道。 发送方使用 zlib 压缩发送给接收方的部分数据。

我想让我的接收器适应 crashes/reboots/restarts,是否可以通过某种方式从随机点加入 zlib 流?

两个 Sender/Receiver 使用 Z_SYNC_FLUSH。

我的一些想法:

  1. 将状态结构保存到磁盘并在接收器重启后重新加载它们。
  2. 将 Z_SYNC_FLUSH 替换为 Z_FULL_FLUSH。

我尝试保存第一个 zlib 压缩数据块,重新启动接收器,然后再次重新发送第一个块,然后从随机块继续流,它似乎工作 - 我不明白为什么,是这是一个可靠的解决方案还是只是运气?

替换为 Z_FULL_FLUSH 似乎没有任何区别。

还有其他方法可以解决这个问题吗?你觉得我错过了什么吗?

非常感谢,
杰森

为确保您可以在没有历史记录的某个时间点开始解压,您必须使用 Z_FULL_FLUSH 或简单地结束流并开始新的流。

对于前者,您可以执行 Z_SYNC_FLUSH 后跟 Z_FULL_FLUSH 以插入两个标记,从而产生九个字节 00 00 ff ff 00 00 00 ff ff,这不太可能随机出现在压缩数据中。您可以对后者执行相同的操作,只需在前一个 zlib 流的结尾和下一个 zlib 流的开头之间插入一个足够大的标记。