解码 iOS 的 compression_encode_buffer 的 LZ4 输出
Decoding the LZ4 output from iOS's compression_encode_buffer
我有一个 iOS 应用程序可以压缩一小块数据。我在 LZ4 模式下使用 compression_encode_buffer 运行 来完成它,因此它足够快以满足我的需要。
稍后,我将我制作的文件 [s] 取出并在 non-Apple 设备上对其进行解码。以前我一直在使用他们的 ZLIB 压缩模式,并且可以使用 System.IO.Compression.DeflateStream.
在 C# 中成功解码它
但是,我对 LZ4 输出感到厌烦。基于 LZ4 文档 here,Apple 将流分成一堆块,每个块以 4 字节幻数、4 字节解压缩大小和 4 字节压缩大小开头。所有这一切都是有道理的,我能够将文件解析成其组成的原始 LZ4 块。缓冲区中的每个块 iOS 输出解压缩到大约 65,635 字节,在我的例子中大约有 10 个。
但是然后:我不知道如何处理我剩下的 LZ4 块。我试过用 LZ4net 的 LZ4.LZ4Stream、LZ4net 的 LZ4.LZ4Codec 解码它们(它管理第一个块,但当我输入第二个块时失败)。我还尝试了几个 C++ 库来解码数据。他们每个人似乎都在寻找 iOS 压缩函数以 non-standard 方式编码的 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 应用程序可以压缩一小块数据。我在 LZ4 模式下使用 compression_encode_buffer 运行 来完成它,因此它足够快以满足我的需要。
稍后,我将我制作的文件 [s] 取出并在 non-Apple 设备上对其进行解码。以前我一直在使用他们的 ZLIB 压缩模式,并且可以使用 System.IO.Compression.DeflateStream.
在 C# 中成功解码它但是,我对 LZ4 输出感到厌烦。基于 LZ4 文档 here,Apple 将流分成一堆块,每个块以 4 字节幻数、4 字节解压缩大小和 4 字节压缩大小开头。所有这一切都是有道理的,我能够将文件解析成其组成的原始 LZ4 块。缓冲区中的每个块 iOS 输出解压缩到大约 65,635 字节,在我的例子中大约有 10 个。
但是然后:我不知道如何处理我剩下的 LZ4 块。我试过用 LZ4net 的 LZ4.LZ4Stream、LZ4net 的 LZ4.LZ4Codec 解码它们(它管理第一个块,但当我输入第二个块时失败)。我还尝试了几个 C++ 库来解码数据。他们每个人似乎都在寻找 iOS 压缩函数以 non-standard 方式编码的 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