是否有一种方法来检查缓冲区是否在Brotli压缩格式

Is there a way to check if a buffer is in Brotli compressed format?

本文关键字:是否 缓冲区 检查 Brotli 格式 压缩 方法 一种      更新时间:2023-10-16

我是一名实习生,正在研究在一个软件中使用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压缩而不尝试解压缩并等待失败?

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

我对随机数据进行了一百万个brotli解压缩试验。大约5%的人被检查出是不错的肉汤。这里已经有问题了。其中3.5%是单字节,因为有9个单字节值,每个值都是一个有效的brotli流。随机有效流的平均长度几乎是1兆字节。

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

简而言之,假阳性的概率相对较高,并且需要处理的字节数可以相当大。

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

Brotli在RFC 7932中正式定义。数据流的格式将在第2节:压缩表示概述和第9节:压缩数据格式中介绍。Brotli不像gzip那样使用前导/尾随标识符,但它确实由一系列未压缩的头和描述压缩数据的命令组成。它们并不都在字节边界上对齐,您必须在位级别上解析它们(Brotli作为位和字节流处理)。请参阅第10节:解码算法了解如何读取这些头。如果您解析出一些遵循Brotli格式的标题而没有错误,那么您可以很好地打赌您正在处理Brotli压缩缓冲区。