如何前进到字节流中包含的压缩字节序列?

2024-03-25

我有一个字节流,它是多个部分的串联,其中每个部分都由一个标头和一个紧缩的字节流组成。

我需要拆分此字节流部分,但标头仅包含有关未压缩形式的数据的信息,没有有关压缩数据长度的提示,因此我可以在流中正确前进并解析下一部分。

到目前为止,我发现超越压缩字节序列的唯一方法是根据本规格 http://www.ietf.org/rfc/rfc1951.txt。根据我通过阅读规范的理解,deflate 流由块组成,这些块可以是压缩块或文字块。

文字块包含一个大小标头,可用于轻松超越它。

压缩块由“前缀码”组成,这些“前缀码”是可变长度的位序列,对 deflate 算法具有特殊含义。由于我只对找出压缩的流长度感兴趣,因此我想我需要查找的唯一代码是“0000000”,根据规范,它表示块的结束。

所以我想出了这个 CoffeeScript 函数来解析 deflate 流(我正在处理 Node.js)

# The job of this function is to return the position
# after the deflate stream contained in 'buffer'. The
# deflated stream begins at 'pos'.
advanceDeflateStream = (buffer, pos) ->
  byteOffset = 0
  finalBlock = false
  while 1
    if byteOffset == 6
      firstTypeBit = 0b00000001 & buffer[pos]
      pos++
      secondTypeBit = 0b10000000 & buffer[pos]
      type = firstTypeBit | (secondTypeBit << 1)
    else
      if byteOffset == 7
        pos++
      type = buffer[pos] & (0b01100000 >>> byteOffset)
    if type == 0
      # Literal block
      # ignore the remaining bits and advance position
      byteOffset = 0
      pos++
      len = buffer.readUInt16LE(pos)
      pos += 2
      lenComplement = buffer.readUInt16LE(pos)
      if (len ^ ~lenComplement)
        throw new Error('Literal block lengh check fail')
      pos += (2 + len) # Advance past literal block
    else if type in [1, 2]
      # huffman block
      # we are only interested in finding the 'block end' marker
      # which is signaled by the bit string 0000000 (256)
      eob = false
      matchedZeros = 0
      while !eob
        byte = buffer[pos]
        for i in [byteOffset..7]
          # loop the remaining bits looking for 7 consecutive zeros
          if (byte ^ (0b10000000 >>> byteOffset)) >>> (7 - byteOffset)
            matchedZeros++
          else
            # reset counter
            matchedZeros = 0
          if matchedZeros == 7
            eob = true
            break
          byteOffset++
        if !eob
          byteOffset = 0
          pos++
    else
      throw new Error('Invalid deflate block')
    finalBlock = buffer[pos] & (0b10000000 >>> byteOffset)
    if finalBlock
      break
  return pos

为了检查这是否有效,我编写了一个简单的摩卡测试用例:

zlib = require 'zlib'

test 'sample deflate stream', (done) ->
  data = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' # length 30   
  zlib.deflate data, (err, deflated) ->
    # deflated.length == 11
    advanceDeflateStream(deflated, 0).shoudl.eql(11)
    done()

问题是这个测试失败了,我不知道如何调试它。我接受任何指出我在解析算法中遗漏的内容或包含任何语言的上述函数的正确版本的答案。


找到 deflate 流甚至 deflate 块末尾的唯一方法是解码其中包含的所有霍夫曼代码。您可以搜索的所有位模式都不会出现在流的较早位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何前进到字节流中包含的压缩字节序列? 的相关文章

  • 如何有效地合并两个 BST?

    如何合并两个二叉搜索树并保持BST的性质 如果我们决定从树中取出每个元素并将其插入到另一个元素中 则此方法的复杂度将为O n1 log n2 where n1是树的节点数 比如T1 我们已经拆分了 并且n2是另一棵树的节点数 比如T2 执行
  • 如何找到给定数组的所有可能的子集?

    我想在 C 或 C 中提取数组的所有可能子集 然后计算所有子集数组各自元素的总和 以检查其中有多少等于给定数字 我正在寻找的是算法 我确实理解这里的逻辑 但我现在还无法实现这一逻辑 考虑一组S of N元素 以及给定的子集 每个元素要么属于
  • 实时跟踪每分钟/小时/天的前 100 个 Twitter 单词

    我最近遇到这样一个面试问题 Given a continuous twitter feed design an algorithm to return the 100 most frequent words used at this min
  • 在 O(nloglogn) 最坏情况时间内对具有 O(logn) 个不同元素的 n 元素数组进行排序

    目前的问题是标题本身的内容 即给出一种算法 该算法在 O log logn 最坏情况时间内对具有 O log n 个不同元素的 n 元素数组进行排序 有任何想法吗 此外 您通常如何处理具有多个非不同元素的数组 O 日志 日志 n 时间足以让
  • 首次执行后 CPU 霍夫曼压缩速度更快?

    我最近用 C 构建了 Huffman 编码的 CPU 实现 我还在 CUDA 中构建了一个 GPU 版本来比较时间 但在测试 CPU 时间时遇到了一个问题 当通过压缩大文件 例如几乎包含字母表中的每个字母和各种其他 ascii 字符的 97
  • 对 Big O 表示法仍然有点困惑

    所以我一直在尽力理解 Big O 表示法 但仍然有一些事情我感到困惑 所以我一直读到如果某件事是 O n 那么它usually指的是算法的最坏情况 但它不一定要指最坏的情况 这就是为什么我们可以说插入排序的最佳情况是 O n 但是 我无法真
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 最大流量算法的修改

    我试图解决一个关于最大流量问题 http en wikipedia org wiki Maximum flow problem 我有一个源和两个接收器 我需要找到该网络中的最大流量 这部分是一般的最大流量 然而 在这个特殊版本的最大流量问题
  • PNG:deflate 和 zlib

    我试图理解 PNG 的压缩 但我似乎 网上查了很多自相矛盾的资料 我想了解 LZ77部分 带链表的哈希表中的搜索是如何完成的 这是在 deflate 中定义的吗 或者在zlib中实现 可以选择搜索方法吗 PNG 编码器 解码器可以设置一些压
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 计算标签云中标签字体大小的公式是什么?

    我有一个标签云 我需要知道如何更改最常用标签的字体大小 我需要设置最小字体大小和最大字体大小 您可以使用线性或对数评估与某个标签相对于最大标签关联的项目数量 将其乘以最小和最大字体大小之间的差值 然后将其添加到最小字体大小 例如 伪代码中的
  • 将区间映射到更小的区间的算法

    我尝试搜索 但由于问题的性质 我无法找到满意的内容 我的问题如下 我试图将 0 到 2000 范围内的数字 尽管理想情况下上限是可调的 映射到 10 到 100 范围内的更小的区间 上限将映射 2000 gt 100 和下限也是如此 除此之
  • 以与版本页面上相同的方式区分两个字符串的算法是什么?

    我正在尝试按短语区分两个字符串 类似于 StackOverflow 在版本编辑页面上区分两个字符串的方式 执行此操作的算法是什么 是否有 gems 或其他标准库可以实现此目的 编辑 我见过其他比较算法 Differ http github
  • 生成非连续组合

    我正在尝试创建一个生成器 支持执行 next 的迭代器 可能在 python 中使用yield 它给出来自 1 2 n n 和 r 是参数 的 r 元素的所有组合 这样在选出的r个元素 没有两个是连续的 例如 对于 r 2 且 n 4 生成
  • 用 ruby​​ 解决旅行商问题(50 多个位置)

    我在一家快递公司工作 目前 我们 手动 解决了 50 多个地点的路线 我一直在考虑使用 Google Maps API 来解决这个问题 但我读到有 24 点的限制 目前我们在服务器中使用 Rails 因此我正在考虑使用 ruby 脚本来获取
  • C# 计算LRC(纵向冗余检查)

    我一直在到处研究这个问题 所有 LRC 实现似乎都没有给我正确的答案 花了几天时间后 我决定将我的代码放在这里 看看其他人是否可以发现问题 这是代码 C Input Data 31303030315E315E31303030325E315E
  • O(mn) 比 O((m+n)^2) 更好吗?

    算法的输入是m and n 我的算法的时间复杂度是O mn 我有一个时间复杂度为的基准算法O m n 我的实现在时间复杂度方面是否优于基准 许多评论者和回答者希望只考虑以下情况 m n或者至少当它们通过一个常数因子相关时 这不是它的工作原理
  • 给定与总和匹配的长度的唯一 3 位数字 (-1,0,1) 序列的数量

    假设您有一个长度为 n 即空格数 的垂直游戏板 你有一个三面骰子 有以下选项 前进一 停留和后退 如果您低于或高于棋盘游戏空间的数量 则该游戏无效 一旦到达棋盘末端 唯一有效的动作就是 停留 给定确切的骰子投掷次数 t 是否可以通过算法计算
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman

随机推荐

  • IBAN 验证检查

    我需要使用 JavaScript 进行 IBAN 验证检查 我需要遵循的规则是 验证 IBANIBAN 的验证方法是将其转换为整数并对其执行基本 mod 97 运算 如 ISO 7064 中所述 如果 IBAN 有效 则余数等于 1 检查国
  • Flexbox:居中元素,两侧有空间元素

    我正在使用 Flexbox 设置一个由七个组成的菜单 li 具有不同宽度的元素 我想要我的中间 源顺序中的第四个 li li 元素始终作为一种锚点水平居中 第 1 3 个元素 li li 元素占据居中左侧的空间 li li 第 5 7 个占
  • 如何将 LESS 集成到 ZendFramework 2 中

    我已经发现本教程 https stephen rees carter net thought integrating less with zend framework the easy way这是为了Zend框架1 我下载少了放在下面项目
  • 如何知道特定的 launchd .plist 文件位置?

    是否可以知道由加载的 plist 文件位置launchctl命令 标签名称列出为launchctl list其内容可以通过以下方式查看launchctl list LABEL 但我找不到 plist 文件位置 我知道它将位于 Library
  • 关于使用 iostream 进行解析的准则是什么?

    我发现自己最近写了很多解析代码 大部分是自定义格式 但并不真正相关 为了增强可重用性 我选择将解析函数基于 I O 流 以便我可以将它们与诸如boost lexical cast lt gt 然而 我意识到我从未在任何地方读过有关如何正确执
  • ASP.NET MVC 如何在不重写 URL 的情况下处理 Application_Error 的 404 错误

    我创建了一个非常简单的 ASP NET MVC 5 应用程序 我想在其中处理我的 404 异常Application Error如图所示这个问题 https stackoverflow com questions 7501810 net m
  • 有没有办法阻止 pandas to_json 添加 \?

    我正在尝试将 pandas 数据帧发送到 json 但我遇到了一些日期问题 我得到了一个额外的 以便我的记录看起来像Updated 09 06 2016 03 09 44 是否可以不添加这个额外的 我假设它是某种转义字符 但我无法找到与此相
  • Laravel 5.3 - InvalidArgumentException 查看 [索引] 未找到 [重复]

    这个问题在这里已经有答案了 I 已经部署我的 Laravel 应用程序到我的VPS 它在本地主机上运行良好 我认为错误出在我的路由中 或者可能是控制器中 因为路径仍然进入我的本地计算机目录 请参阅错误消息第 2 行 但我确实看不到代码中的问
  • 在 MySQL 中使用 JOIN 时避免出现不明确的列错误

    我的查询如下所示 sql SELECT u s FROM bands u inner join statuses s on u status id s id WHERE u status id 1 ORDER BY u band name
  • CGBitmapContextCreate:不支持的参数组合

    我正在尝试创建一个 8 位灰度上下文 如下所示 CGColorSpaceRef colorSpace CGColorSpaceCreateDeviceGray CGContextRef context CGBitmapContextCrea
  • Interface Builder:如何清理已删除的约束?

    我使用命令删除来删除 IB 中地图视图小部件的一些约束 正如附图所示 约束实际上只是褪色 而不是完全删除 我已经尝试过保存文件并重新打开项目 但似乎它们不会被 XCode 删除 我怎样才能将它们删除 EDIT 这是我在尺寸检查器窗口中看到的
  • 连续输入时不要引发 TextChanged

    我有一个相当大的文本框 TextChanged事件处理程序 在正常打字条件下 性能还不错 但当用户执行长时间连续操作时 例如按住退格按钮一次删除大量文本 它可能会明显滞后 例如 事件需要 0 2 秒才能完成 但用户每 0 1 秒执行一次删除
  • 仅用图像制作按钮的最简单方法

    我正在使用 Delphi XE 我想制作一个按钮 仅显示提供的具有透明背景的 PNG 图像 并且没有任何类型的附加边距 我尝试使用 TButton 执行此操作 但我得到了 bsPushButton 样式的难看的灰色背景 如果我使用 bsCo
  • Gradle 无法解析 com.google.android.gms:play-services-auth:11.6.0 [重复]

    这个问题在这里已经有答案了 我正在尝试在我的移动应用程序中使用谷歌登录 但在遵循谷歌的教程后出现以下错误 无法解析 com google android gms play services auth 11 6 0 我的 gradle 文件
  • 在 UIButton 内显示活动指示器

    我想在按下 UIButton 后将其内容更改为 ActivityIndi cator 我知道按钮有 imageView 和 titleLabel 但我不知道如何在其中放置活动指示器 这就是我创建活动指标的方法 let aiView UIAc
  • PostgreSQL ORDER BY 列位置(而不是按列名称)

    基本上 我不想要 SELECT firstname lastname FROM person ORDER BY lastname 反而 SELECT firstname lastname FROM person ORDER BY
  • 单个 XSLT 文件能否解决这个问题……或者……?

    下面是我的 XML 文件
  • do while 循环不能有两个 cin 语句吗?

    我只是遵循一个关于 do while 循环的简单 C 教程 我似乎已经完全复制了教程中编写的内容 但我没有得到相同的结果 这是我的代码 int main int c 0 int i 0 int str do cout lt lt Enter
  • 如何在 BigQuery 中透视表

    我正在使用 Google Big Query 并且正在尝试从公共样本数据集中获取数据透视结果 对现有表的简单查询是 SELECT FROM publicdata samples shakespeare LIMIT 10 该查询返回以下结果集
  • 如何前进到字节流中包含的压缩字节序列?

    我有一个字节流 它是多个部分的串联 其中每个部分都由一个标头和一个紧缩的字节流组成 我需要拆分此字节流部分 但标头仅包含有关未压缩形式的数据的信息 没有有关压缩数据长度的提示 因此我可以在流中正确前进并解析下一部分 到目前为止 我发现超越压