是否有一种方法来检查缓冲区是否在Brotli压缩格式
Is there a way to check if a buffer is in Brotli compressed format?
我是一名实习生,正在研究在一个软件中使用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压缩缓冲区。
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 是否可以在C++中拼接缓冲区,零拷贝?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- 输出操纵器 std::ends 是否向输出缓冲区添加空字符?
- 是否可以等待来自暂存缓冲区的传输完成而不调用 vkQueueWaitIdle
- Qt是否能够支持小缓冲区低延迟视频应用(例如实时流)
- C 文本写入随机数据.是否有缓冲区溢出
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 我是否需要删除传递给谷歌协议缓冲区(protobuf)的对象
- 是否可以在同一设备缓冲区上一个接一个地调用 OpenCL 内核?
- 当构建器被销毁时,缓冲区是否有效
- 使用大长度缓冲区初始化字符串流是否会使内存使用量加倍
- 如何检查输入缓冲区是否为空
- 如何检查 cin 缓冲区是否包含相同的值 0.5 秒 (C++)
- 将新放置到缓冲区后,缓冲区和实例是否具有相同的 void* 地址?
- 是否存在以相反顺序填充缓冲区的MEMSET函数
- 是否可以在键盘输入缓冲区中向前看并在MFC/Win32中检测条形码条目
- 换行符是否也会刷新缓冲区?