在Ruby中搜索二进制数据

时间:2010-08-06 16:47:45

标签: ruby regex binary-data

只使用纯ruby(或称为普通的gems)是否有一种有效的方法来搜索大型二进制文档中的特定字节串?


更深层的上下文:mpeg4容器格式是一个4字节的索引序列化数据结构,无需完全解析结构(我可以假设它是有效的)我想提取特定的标签。

对于那些没有遇到过这个'dmap'序列化的人来说,它之前的工作方式是这样的:

<4-byte length<4-byte tag><4-byte length><4-byte type definition><8 bytes of something I can't remember><data>

例如,这将'tvsh'(或电视节目)标签定义为'Futurama'

00 00 00 20  ... 
74 76 73 68  tvsh
00 00 00 18  ....
64 61 74 61  data
00 00 00 01  ....
00 00 00 00  ....
46 75 74 75  Futu
72 61 6D 61  rama

确切的结构并不重要,我想写一个方法,当我给它'tvsh'时可以拉出节目名称,或者如果我给它'tvsn'那就是第2季。

我的第一个计划是使用正则表达式,但我觉得(不合理)感觉这会很慢。

让我知道你的想法!提前致谢

3 个答案:

答案 0 :(得分:1)

如果我正确理解你的描述,整个文件由一些固定结构的“块”组成?

在这种情况下,我建议逐个扫描,并跳过不感兴趣的那些。因此,您的每一步都应该执行以下操作:

  1. 读取8个字节(使用IO#readbytes或类似方法)
  2. 从读取标头中提取size(前4个字节)和tag(后4个)
    1. 如果标签是您需要的标签,请跳过以下16个字节并阅读size-24个字节。
    2. 如果标签不感兴趣,请跳过size-16个字节。
  3. 重复。
  4. 对于跳过字节,您可以使用IO#seek

答案 1 :(得分:1)

在Ruby中,您可以在创建正则表达式时使用/n标志来告诉Ruby您的输入是8位数据。

您可以使用/(.{4})tvsh(.{4})data(.{8})([\x20-\x7F]+)/n匹配4个字节,tvsh,4个字节,data,8个字节以及任意数量的ASCII字符。我没有看到为什么这个正则表达式比手动编码类似搜索要慢得多的原因。如果您不关心4字节和8字节块,/tvsh.{4}data.{8}([\x20-\x7F])/n应该与tvsh的文字文本搜索一样快。

答案 2 :(得分:0)

理论上,您可以对任意数据使用正则表达式,包括二进制字符串。 HTH。