代码之家  ›  专栏  ›  技术社区  ›  Yoric

交错/多路复用压缩流

  •  1
  • Yoric  · 技术社区  · 8 年前

    我正在寻找一个好的压缩算法或库,可以让我将几个压缩的数据流交错到一个单一的数据流中, 无性能或压缩损失 .

    更多上下文:我一直在研究一种专用于特定应用程序的压缩格式。这种压缩格式对数据执行一系列特定于域的分析,然后将压缩的数据输出为一系列流,每个流都被压缩(通常使用lzw,但不是用石头写的)。其中一条小溪, 一次流 ,包含一堆 令牌 . 来自主流的每个令牌都包含我需要推断哪些次流包含我的下一个流的信息 令牌 ,需要从该次流中读取多少已解压缩的字节,以及如何处理该令牌。

    到目前为止,还不错,但我不想将最终数据作为一组连接的流发送,因为这需要我在有意义地处理之前接收整个数据。相反,我想把它们作为一个单独的流来发送,这样我可以在接收到它们时进行解码和处理。所以这基本上是想发送一些东西:

    • 来自主流的一个令牌(用用于主流的字典压缩);
      • 好的,这是标记“foo bar”,我知道标记“foobar”后面总是跟两个来自流“foo”的标记,一个来自流“bar”的标记;
    • 来自流“foo”的两个令牌(用用于流“foo”的字典压缩);
    • 流“bar”中的一个令牌(用用于流“bar”的字典压缩);
    • 一个来自主流的令牌(返回到主流的压缩);

    这里的复杂之处在于,任何有趣的压缩算法都不会将一个令牌转换为一个或多个具有定义良好的令牌端的字节。有时,对于一个令牌,它将是几个包。有时,一个包会包含许多令牌。幸运的是,我的代币的大小很容易预测。另一方面,为了节省空间,我负担不起每次添加一个包时写入每个包的大小或包的数量。

    那么,我如何能够在不需要添加大量元数据的情况下将所有压缩流多路复用/交织到单个流中呢?我的印象是,这基本上是多媒体格式解决的问题,但我对这个主题没有领域知识。有什么建议吗?我对算法、图书馆和论文感兴趣。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Mark Adler    8 年前

    例如,使用zlib,您可以为三个流同时运行三个deflate实例。使用deflate,您可以一次压缩一个deflate块(使用z_块),并使用z_sync_flush将其带到一个空存储块的字节边界。您可以交错这些放气块,因为它们是用一个字节的头为每个标识它来自三个流中的哪一个而生成的。然后,您的解压器读取这些放气块,并使用三个充气实例对其进行解压缩,在这些未压缩数据块可用时从它们中提取令牌。

    推荐文章