【问题标题】:Is there a way to check if a buffer is in Brotli compressed format?有没有办法检查缓冲区是否为 Brotli 压缩格式?
【发布时间】:2016-08-18 02:17:42
【问题描述】:

我是一名实习生,正在研究在软件中使用 Brotli 压缩是否比使用 GZip 的当前版本提供性能提升。

我的任务是使用 GZip 将任何内容更改为使用 Brotli 压缩。我需要替换的一个函数会检查缓冲区是否包含使用 GZip 压缩的数据。它通过检查开头和结尾的流标识符来做到这一点:

bool isGzipped() const
{
    // Gzip file signature (0x1f8b)
    return
        (_bufferEnd >= _bufferStart + 2) &&
        (static_cast<unsigned char>(_bufferStart[0]) == 0x1f) &&
        (static_cast<unsigned char>(_bufferStart[1]) == 0x8b);
}

我想创建类似的函数bool isBrotliEncoded()。我想知道是否可以使用 Brotli 编码的缓冲区进行类似的快速检查?我查看了 brotli 生成的一些压缩文件的字节值,但我找不到适用于所有这些文件的规则。有些以0x5B 开头,有些以0x1B 开头,空文件的压缩结果为0x06,并且多次压缩的文件以一系列不同的值开头。每个文件的结尾也不一致。

我知道的唯一测试格式是否正确的方法是尝试解压缩并等待错误,这违背了进行此测试的目的。

所以我的问题是:有谁知道如何在不尝试解压缩并等待失败的情况下检查缓冲区是否已使用 Brotli 压缩?

【问题讨论】:

    标签: c++ compression brotli


    【解决方案1】:

    不幸的是,原始的 brotli 格式不太适合这种检测,即使只是尝试解压缩并等待错误时也是如此。

    我对随机数据进行了 100 万次 brotli 解压缩试验。其中大约 5% 的人被视为良好的 brotli 流。所以你已经有问题了。百万中的 3.5% 是单字节,因为有九个单字节值,每一个都是有效的 brotli 流。随机有效流的平均长度几乎是一兆字节。

    对于那些检测到错误的案例(大约 95% 的百万案例),有 3.5% 的案例在检测到错误之前超过了 1 兆字节。 1.4% 超过 10 兆字节。发现错误之前的平均随机字节数为 309 KB。另一个问题。

    简而言之,误报的概率比较高,要处理的字节数可能会很大。

    如果您正在编写此软件,那么您应该将自己的标题放在 brotli 数据之前以帮助检测。或者您可以使用brotli framing format that I developed at their request,它在 brotli 压缩流之前有一个唯一的四字节标头。这将大大降低误报的可能性。

    【讨论】:

    • 好的,感谢您提供信息丰富的回复 :) 我也许可以避免要求压缩文件具有正确的文件扩展名,但我一定会记住您的框架格式以备将来使用.
    【解决方案2】:

    Brotli 在RFC 7932 中正式定义。数据流的格式在Section 2: Compressed Representation OverviewSection 9: Compressed Data Format 中有介绍。 Brotli 不像 gzip 那样使用前导/尾随标识符,但它确实由一系列未压缩的标头和描述压缩数据的命令组成。它们并非都在字节边界上对齐,您必须在位级别解析它们(Brotli 被处理为位和字节流)。请参阅Section 10: Decoding Algorithm 了解如何阅读这些标题。如果您解析出一些遵循 Brotli 格式的标头而没有错误,那么您正在处理 Brotli 压缩缓冲区是一个不错的选择。

    【讨论】:

    • 感谢您的回复,我会试一试:)
    • 唉,这通常比“几个标题”要多得多,即便如此,这也不是一个很好的选择。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2023-03-08
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多