我是一名实习生,研究在软件中使用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压缩了缓冲区?
发布于 2016-08-19 05:58:11
不幸的是,原始的brotli格式并不适合这样的检测,即使只是试图解压缩和等待错误。
我试验了一百万个随机数据的brotli解压。其中约有5%被确认为良好的溴溪。所以你已经有麻烦了。3.5%的百万是一个字节,因为有九个一个字节的值,每个字节都是一个有效的brotli流。随机有效流的平均长度几乎是1兆字节。
对于那些检测到错误的人(约占百万例病例的95% ),3.5%的人在发现错误之前超过了1兆字节。1.4%超过10兆字节。在发现错误之前,随机字节的平均数量为309 KB。另一个问题。
总之,假阳性的概率相对较高,要处理的字节数可以相当大。
如果您正在编写此软件,那么您应该将自己的头放在brotli数据之前,以帮助检测。或者您可以使用我应他们的要求开发的brotli框架格式,它在brotli压缩流之前有一个唯一的四字节头。这将大大降低出现假阳性的可能性。
发布于 2016-08-18 05:59:16
Brotli是在RFC 7932中正式定义的。数据流的格式包含在第2节:压缩表示概述和第9节:压缩数据格式中。Brotli不像gzip那样使用前导/尾随标识符,但它确实由一系列未压缩的头和命令组成,它们描述了压缩数据。它们并不都是在字节边界上对齐的,而是必须在位级别解析它们(Brotli被处理为一个位和字节流)。有关如何读取这些标头,请参阅第10节:解码算法。如果您没有错误地解析出一些遵循Brotli格式的头,那么很好地肯定您正在处理的是Brotli压缩缓冲区。
https://stackoverflow.com/questions/39008957
复制相似问题