我是一名实习生,正在研究在软件中使用 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% 被检验为良好的 brotli 流。所以你已经遇到了问题。一百万中的 3.5% 是单个字节,因为有 9 个单字节值,每个值都是有效的 brotli 流。随机有效流的平均长度几乎为一兆字节。
对于检测到错误的案例(约占百万案例中的 95%),3.5% 的案例在检测到错误之前数据量超过了 1 MB。 1.4% 的大小超过十兆字节。发现错误之前的平均随机字节数为 309 KB。另一个问题。
简而言之,误报的概率相对较高,并且要处理以查找否定的字节数可能相当大。
如果您正在编写此软件,那么您应该将自己的标头放在 brotli 数据之前以帮助检测。或者您可以使用我应他们的要求开发的 brotli 框架格式 https://github.com/madler/brotli/blob/master/br-format-v3.txt,它在 brotli 压缩流之前有一个唯一的四字节标头。这将大大降低误报的可能性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)