有没有办法检查缓冲区是否为 Brotli 压缩格式?

naf*_*arn 3 c++ compression brotli

我是一名实习生,正在研究在某个软件中使用 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*ler 6

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

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

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

简而言之,误报的概率相对较高,并且要处理的字节数可能会非常大。

如果您正在编写此软件,那么您应该将自己的标题放在 brotli 数据之前以帮助检测。或者您可以使用我根据他们的要求开发brotli 成帧格式,它在 brotli 压缩流之前有一个唯一的四字节标头。这将大大降低误报的可能性。