【问题标题】:LZ4 Decompress Binary Memory Block Of Unknown SizeLZ4 解压未知大小的二进制内存块
【发布时间】:2016-07-11 20:28:43
【问题描述】:

我正在尝试解压缩一块内存,但我不知道它的原始未压缩大小,但是,我确实知道该原始内存块的最大大小。

有没有什么方法可以在不知道原始未压缩大小的情况下用LZ4解压?

短篇长篇: 我正在使用名为 Cereal 的第三方库将一堆变量序列化为字符串流。 Cereal 将使用“便携式二进制格式”将您的数据序列化为字符串流,这意味着字节序被保留,如果需要,甚至在反序列化期间转换为主机的字节序。 然后使用 LZ4 压缩字符串流并传输到远程机器进行解压缩和反序列化。

我的问题是 LZ4 将输出一个压缩数据的内存块和一个指定压缩数据大小的整数。要解压缩,您需要压缩后的大小和原始大小,我只是将压缩后的数据块发送到远程机器。

那么,有没有办法在不知道原始压缩大小的情况下使用 LZ4 解压缩数据块?本质上是“开始解压,当你用完数据时你就完成了”

【问题讨论】:

    标签: c++ winsock2 cereal lz4


    【解决方案1】:

    函数LZ4_decompress_safe(参见https://github.com/Cyan4973/lz4/blob/master/lib/lz4.c#L1288)似乎只需要最大解压缩大小。在这种情况下,你可以分配一个足够大的缓冲区来解压并使用它。

    要么这样,要么将原始未压缩大小也传输到远程机器。

    编辑:在您的情况下,您还可以使用 LZ4 流式解压缩,请参阅this code sample 了解更多信息。

    【讨论】:

    • LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) 需要压缩大小;传递 0/NULL 会导致解压失败。所有的解压方式都要求compressedSize/originalSize,未知但有最大值。
    • 你的意思是没有压缩后的大小,解压后的大小,还是两者都没有?
    • 我不知道“真实”的压缩大小;它可能只有 500 字节,但保存在 1436 字节的更大缓冲区中。传递 1436 作为 'compressedSize' 失败,传递 500 将成功。
    • 如果数据只是部分给出,并不是每个压缩算法都会成功(例如,如果你破坏了一个 LZ4 块,你将无法解压缩它)。但是,如果您知道给出了整个块,为什么不使用 LZ4 (LZ4_createStreamDecode) 的流解码功能?
    • 查看我的编辑以获取有关使用 LZ4 进行流式解压的代码示例。
    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多