我有一个 iOS 应用程序,可以压缩一堆小数据 block 。我使用在 LZ4 模式下运行的 compression_encode_buffer 来执行此操作,这样它的速度足以满足我的需求。
后来,我将制作的文件在非 Apple 设备上进行解码。以前我一直在使用他们的 ZLIB 压缩模式,并且可以使用 System.IO.Compression.DeflateStream 在 C# 中成功解码它。
但是,我对 LZ4 输出感到很不舒服。基于LZ4文档here ,Apple 将流分成一堆 block ,每个 block 以 4 字节魔数(Magic Number)、4 字节解压缩大小和 4 字节压缩大小开头。所有这些都是有道理的,我能够将文件解析为其组成的原始 LZ4 block 。 iOS 输出缓冲区中的每个 block 解压缩为大约 65,635 字节,在我的例子中大约有 10 个。
但是:我不知道如何处理剩下的 LZ4 block 。我尝试使用 LZ4net 的 LZ4.LZ4Stream、LZ4net 的 LZ4.LZ4Codec 解码它们(它管理第一个 block ,但当我输入第二个 block 时失败)。我还尝试了几个 C++ 库来解码数据。他们每个人似乎都在寻找 iOS 压缩函数以非标准方式编码的 header 。
最佳答案
回答我自己的问题:Apple 的 LZ4 解压缩器(经过必要的修改以处理其原始存储格式)位于:https://opensource.apple.com/source/xnu/xnu-3789.21.4/osfmk/vm/lz4.c.auto.html
事后编辑:实际上我没能让它工作,但我没有花太多时间在上面,因为我找到了 Apple 的 LZFSE 解压缩器。
LZFSE 解压器可以在这里找到:https://github.com/lzfse/lzfse
关于ios - 从 iOS 的 Compression_encode_buffer 解码 LZ4 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42755614/