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

2024-02-17

我是一名实习生,正在研究在软件中使用 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(使用前将#替换为@)

有没有办法检查缓冲区是否采用 Brotli 压缩格式? 的相关文章

随机推荐

  • 使用谷歌直方图创建日期直方图

    如何创建适用于日期的 Google 直方图 1 我已经放置了示例代码 带有工作号码和非工作日期示例 http jsfiddle net Qquse 417 http jsfiddle net Qquse 417 和下面的代码 2 1 htt
  • 为什么 Spring 允许在私有方法上进行控制器注释的请求映射?

    今天刚刚在 Spring MVC 控制器类中遇到了这个 RequestMapping value foo method RequestMethod GET private String doThing final WebRequest re
  • 为什么表单提交会打开新窗口/选项卡?

    我发现了很多问题 如何在新窗口中打开表单结果 https stackoverflow com search q spring 20form 20new 20window 但我面临着相反的问题 我有表格
  • 使用 twitter bootstrap 3 将 9 列布局居中

    我的代码就像 div class container fluid div class row div class col md 3 div div class col md 3 div div class col md 3 div div
  • 使用 Google Analytics 管理 API 和应用脚本提取 GA4 媒体资源列表

    想知道是否有人有使用新的 Analytics Admin API 将 GA 帐户和属性列表导出到电子表格的经验 我过去曾使用管理 API 来实现此目的 但这限制了我们只能使用 UA 属性 我希望也能在此处包含 GA4 属性 我尝试过将旧脚本
  • simplemembership MVC4 通过 userId 获取用户名

    使用 MVC4 和 SIMPLEMEMBERSHIP 的人知道如何通过 userId 获取用户名 用户未登录 我想删除它 要删除我必须使用 Membership DeleteUser string username 你可以使用GetUser
  • 连接来自不同服务器的表

    有什么建议如何在存储过程中连接来自不同服务器的表吗 如果没有更多细节 很难给出直接的例子 但基本思想如下 首先 在存储过程之外 主机服务器 存储过程所在的服务器 必须了解第二台服务器 包括 可能 登录信息 在您的主服务器上 运行sp add
  • TestCafe——断言元素可见的正确方法

    根据各种论坛讨论 TestCafe 文档以及尝试比较结果 我仍然不确定哪种是断言页面元素可见的正确 或最佳 方法 await t expect Selector elementId visible ok vs await t expect
  • 使用 Javascript 在 Span 标记内动态插入链接

    我有这个 span class image img src something jpg span 我想使用 javascript 将其转换为 span class image a href domain img src something
  • 如何为我的石头剪刀布游戏编写一套更简洁的代码?

    下面是我在 Web 开发课程中必须进行的石头剪刀布游戏活动的 JS 文件 我能够让一切正常工作 但是我不喜欢 if else 语句使我的代码花费了多长时间 并且想知道如何使其更加简洁并以更少的代码行数实现 const imagePath i
  • 将 div 容器调整为视频大小(也可全屏)

    我正在尝试获取覆盖视频的文本 并根据其大小调整进行相应的操作 目前我的麻烦是使视频容器的大小与播放器相同 以及全屏模式 我的容器是相对定位的 我的视频和文本叠加 div 是绝对定位的 HTML div div
  • 使用 SoX 将 mp3 文件分割为 TIME 秒

    我需要将 mp3 文件分割成片TIME每秒 我试过了mp3splt 但如果输出是 它对我不起作用不到1分钟 是否可以这样做 sox file in mp3 file out mp3 trim START LENGTH 当我不知道mp3文件时
  • 使用 spring 集成 aws 轮询 S3 存储桶中的文件并进行处理

    我需要轮询 S3 存储桶中的文件 并在任何文件可用时立即拾取并处理它们 我需要使用 Spring Integration 和 spring integration aws 来完成此操作 所以到目前为止我的代码看起来像这样 public Am
  • 将不存在的元素添加到 DynamoDB 中的数组

    我正在尝试更新项目属性 即字符串列表 仅当属性不存在时我才可以更新 追加 该属性吗 类似于 list append 和 if not exists var 参数 UpdateExpression 设置朋友 list append if no
  • 增加 ggplot 标题中下划线的大小

    我正在尝试增加 ggplot 标题中下划线的大小 宽度 厚度 我尝试过使用尺寸 宽度和长度 但没有成功 这是我所做的一个例子 test lt tibble x 1 5 y 1 z x 2 y ggplot test aes x z geom
  • Spring 3.1.1 与 hibernate 4.1 注解配置

    我正在使用 spring3 1 1 和 hibernate 4 1 设置新项目 当我运行我的项目时 出现以下错误 java lang NoSuchMethodError org hibernate SessionFactory getCur
  • 获取Redis集群中所有key

    我使用的是Redis集群版本redis 5 0 5 我想查看 Redis 集群中存在的所有密钥 我知道我们使用独立的KEYS 获得所有钥匙 如何查看Redis集群中的所有键 redis cli h hostname p 90001 c ho
  • 如何托管我自己的私有 conda 存储库?

    我有几个相互依赖的 python 项目 我为每个项目都有不同的发行版本 不同的项目可能依赖于特定项目的不同发行版本 我想在内部服务器上创建自己的 conda 存储库 在其中我可以将这些项目的版本作为 conda 包推送 其他项目可以从那里安
  • window.location.href 与单击锚点

    点击有什么区别 a href href a vs calling window location href 只要有可能 您应该使用 a href foo html over window location href 有很多很好的理由 如果您
  • 有没有办法检查缓冲区是否采用 Brotli 压缩格式?

    我是一名实习生 正在研究在软件中使用 Brotli 压缩是否可以比当前版本 使用 GZip 带来性能提升 我的任务是使用 GZip 更改任何内容以使用 Brotli 压缩 我需要替换的一个函数会检查缓冲区是否包含使用 GZip 压缩的数据