Stream 重建zlib流
我的项目包含一个发送者/接受者框架,它只能单向交谈,从接受者到发送者没有返回通道。 发送方使用zlib压缩发送给接收方的部分数据 我想让我的接收器对崩溃/重新启动/重新启动有弹性,是否可以以某种方式从随机点加入zlib流 两个发送方/接收方都使用Z_SYNC_FLUSH 我有一些想法:Stream 重建zlib流,stream,compression,zlib,Stream,Compression,Zlib,我的项目包含一个发送者/接受者框架,它只能单向交谈,从接受者到发送者没有返回通道。 发送方使用zlib压缩发送给接收方的部分数据 我想让我的接收器对崩溃/重新启动/重新启动有弹性,是否可以以某种方式从随机点加入zlib流 两个发送方/接收方都使用Z_SYNC_FLUSH 我有一些想法: 将状态结构保存到磁盘,并在接收器重新启动后重新加载它们 将同步刷新替换为完全刷新 我尝试保存zlib压缩数据的第一块,重新启动接收器,然后再次重新发送第一块,然后从一个随机块继续流,它似乎工作了-我不明白为什么,
Jason为了确保您可以在没有历史记录的某个点开始解压缩,您必须使用
Z_FULL_FLUSH
或简单地结束流并启动一个新的流
对于前者,您可以先执行
Z_SYNC_FLUSH
,然后执行Z_FULL_FLUSH
,以便插入两个标记,从而生成九个字节00 00 ff 00 00 ff
,这在压缩数据中不太可能随机出现。对于后者,您也可以这样做,只需在上一个zlib流的结束和下一个zlib流的开始之间插入一个足够大的标记。为了确保您可以在没有历史记录的某个点开始解压缩,您必须使用Z_FULL_FLUSH
或简单地结束流并启动一个新的流
对于前者,您可以先执行
Z_SYNC_FLUSH
,然后执行Z_FULL_FLUSH
,以便插入两个标记,从而生成九个字节00 00 ff 00 00 ff
,这在压缩数据中不太可能随机出现。对于后者,您也可以这样做,只需在前一个zlib流的结束和下一个zlib流的开始之间插入一个足够大的标记。我不能要求发送方结束流并启动一个新的流,因为发送方通过单向链接连接到接收方,发送方无法知道接收方重新启动并需要新的流。我重试ZyFulfFLUH,我用“不正确的头检查”来获得ZyDATAYORM错误,我尝试调用GruteSycYME(),在从ZEDATA()获得ZYDATAYROR错误之后,GROUTATESYNC()返回ZYOK,但是FURATE()返回相同的错误。如果您不控制发送端,那么在流的中间没有重启的方法。code>Z_FULL_FLUSH只对deflate()
,而不是充气()
。谢谢你,马克,你有没有解释一下我在问题中描述的场景是如何可能的?我将获取流的第一个块(deflate()的第一个输出),并在它重新启动后将其发送给接收方,然后从流中选择一个随机块并将其发送给接收方。随机块充气成功,怎么可能?如果我没记错的话,充气功能是从以前的数据中寻找序列,在本例中,这些数据丢失了。我无法理解您在问题中对场景的描述。你需要考虑什么是“成功”的意思。如果你在中间断开一个收缩流并在那之后输入随机数据,那么在一定的距离内,它可能确实继续“成功”,因为它不会立即返回错误。但是,它将生成垃圾,当意外遇到块结束代码时,它最终将失败,并且下一个块是乱七八糟的。如果我能保证在接收器重新启动后,只有有效的zlib块被传递到充气()并且如果我能容忍前几个块的解压缩将无效,它应该长期有效吗?如果我没有弄错的话,WindowsSize默认为32K,这意味着在32K最大值之后,解压缩应该再次有效。在我的测试中,它看起来也不错。我不能要求发送方结束流并启动一个新流,因为发送方通过单向链接连接到接收方,发送方无法知道接收方重新启动并需要一个新流。我重试ZyFulfFLUH,我用“不正确的头检查”来获得ZyDATAYORM错误,我尝试调用GruteSycYME(),在从ZEDATA()获得ZYDATAYROR错误之后,GROUTATESYNC()返回ZYOK,但是FURATE()返回相同的错误。如果您不控制发送端,那么在流的中间没有重启的方法。code>Z_FULL_FLUSH只对deflate()
,而不是充气()
。谢谢你,马克,你有没有解释一下我在问题中描述的场景是如何可能的?我将获取流的第一个块(deflate()的第一个输出),并在它重新启动后将其发送给接收方,然后从流中选择一个随机块并将其发送给接收方。随机块充气成功,怎么可能?如果我没记错的话,充气功能是从以前的数据中寻找序列,在本例中,这些数据丢失了。我无法理解您在问题中对场景的描述。你需要考虑什么是“成功”的意思。如果你在中间断开一个收缩流并在那之后输入随机数据,那么在一定的距离内,它可能确实继续“成功”,因为它不会立即返回错误。但是,它将生成垃圾,当意外遇到块结束代码时,它最终将失败,并且下一个块是乱七八糟的。如果我能保证在接收器重新启动后,只有有效的zlib块被传递到充气()并且如果我能容忍前几个块的解压缩将无效,它应该长期有效吗?如果我是