Stream 重建zlib流

Stream 重建zlib流,stream,compression,zlib,Stream,Compression,Zlib,我的项目包含一个发送者/接受者框架,它只能单向交谈,从接受者到发送者没有返回通道。 发送方使用zlib压缩发送给接收方的部分数据 我想让我的接收器对崩溃/重新启动/重新启动有弹性,是否可以以某种方式从随机点加入zlib流 两个发送方/接收方都使用Z_SYNC_FLUSH 我有一些想法: 将状态结构保存到磁盘,并在接收器重新启动后重新加载它们 将同步刷新替换为完全刷新 我尝试保存zlib压缩数据的第一块,重新启动接收器,然后再次重新发送第一块,然后从一个随机块继续流,它似乎工作了-我不明白为什么,

我的项目包含一个发送者/接受者框架,它只能单向交谈,从接受者到发送者没有返回通道。 发送方使用zlib压缩发送给接收方的部分数据

我想让我的接收器对崩溃/重新启动/重新启动有弹性,是否可以以某种方式从随机点加入zlib流

两个发送方/接收方都使用Z_SYNC_FLUSH

我有一些想法:

  • 将状态结构保存到磁盘,并在接收器重新启动后重新加载它们
  • 将同步刷新替换为完全刷新
  • 我尝试保存zlib压缩数据的第一块,重新启动接收器,然后再次重新发送第一块,然后从一个随机块继续流,它似乎工作了-我不明白为什么,这是一个解决方案还是只是运气

    换成Z_FULL_FLUSH似乎没什么区别

    有没有其他办法解决这个问题?你觉得我错过了什么吗

    非常感谢,

    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块被传递到充气()并且如果我能容忍前几个块的解压缩将无效,它应该长期有效吗?如果我是