重建 zlib 流
Reconstructing zlib stream
我的项目包含一个只能单向通信的 Sender/Receiver 框架,没有从接收方到发送方的 return 通道。
发送方使用 zlib 压缩发送给接收方的部分数据。
我想让我的接收器适应 crashes/reboots/restarts,是否可以通过某种方式从随机点加入 zlib 流?
两个 Sender/Receiver 使用 Z_SYNC_FLUSH。
我的一些想法:
- 将状态结构保存到磁盘并在接收器重启后重新加载它们。
- 将 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 流的开头之间插入一个足够大的标记。
我的项目包含一个只能单向通信的 Sender/Receiver 框架,没有从接收方到发送方的 return 通道。 发送方使用 zlib 压缩发送给接收方的部分数据。
我想让我的接收器适应 crashes/reboots/restarts,是否可以通过某种方式从随机点加入 zlib 流?
两个 Sender/Receiver 使用 Z_SYNC_FLUSH。
我的一些想法:
- 将状态结构保存到磁盘并在接收器重启后重新加载它们。
- 将 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 流的开头之间插入一个足够大的标记。