【问题标题】:inflate (decompress) a datastream on an embedded device在嵌入式设备上膨胀(解压缩)数据流
【发布时间】:2019-04-06 22:19:34
【问题描述】:

我打算对通过慢速串行接口传输的数据流使用压缩。 解压应该在资源有限(无操作系统、无线程、有限内存)的低成本微控制器上进行。

在之前的类似配置中,我使用了 zlib 的 puff.c,但在这种情况下,a 有一个缓冲区来存储之前的所有数据,并且可以一次全部膨胀。

在我的实际情况中,我没有足够的内存来存储这些缓冲区,所以我需要逐步膨胀数据。 因此,我需要能够在每次新数据到达时调用它,而不是让 puff 在缓冲区上工作,从而在后续调用之间保持内部状态。

在我开始深入研究 zlib 或 zlibs puff.c 之前,有人知道这类问题是否已经在某个地方解决了吗?

【问题讨论】:

  • 发送前是否需要即时压缩或离线压缩?
  • “查找库”问题在 SO 上是题外话,而且您已经找到它:ZLIB 使用流接口并且完全能够使用小缓冲区对流进行膨胀。 zlib.net/zlib_how.html 的 ZLIB 使用示例准确地展示了如何使用固定大小的缓冲区对流进行膨胀 - 该示例使用 16Kb 但它可以更小(设置CHUNK 大小)。完整代码在zlib.net/zpipe.c

标签: c embedded inflate


【解决方案1】:

.GIF 文件格式压缩算法(LZW,LZ78 的一种变体)几乎只需要在内存中维护一个哈希表。当表格填满时,它被清空,并且该过程重复,这意味着表格不会无限增长。也没有必要保留压缩数据。很少需要维护其他状态。使用这样的算法(也许,减少哈希表的大小),您可以在数据进入时对其进行解压缩。

我没有研究过其他 LZ 算法,但我希望(部分或全部?)它们本质上是相似的。

【讨论】:

    【解决方案2】:

    我用过LZSS。我使用来自Haruhiko Okumuracode 作为基础。它使用未压缩数据(2K)的最后一部分作为字典。如果内存中有所有可用的未压缩数据,我链接的代码可以修改为几乎不使用内存。通过谷歌搜索,您会发现许多不同的实现具有各种许可证。

    另一个选项可能是实现 LZF 的 lzfx 库。我还没有使用它,但它看起来不错。还使用以前的结果,因此它对内存的要求较低,并且是在 BSD 许可证下发布的。

    【讨论】:

      【解决方案3】:

      感谢您的所有 cmets 和建议。

      经过调查,我会坚持使用 puff.c 并对其进行修改 或者我将使用我在这里找到的 uzlib: https://github.com/pfalcon/uzlib/

      【讨论】:

        猜你喜欢
        • 2017-12-12
        • 2014-07-25
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        相关资源
        最近更新 更多