如何在ruby中拆分字节序列并保留delimeter?

如何在ruby中拆分字节序列并保留delimeter?,ruby,byte,reverse-engineering,Ruby,Byte,Reverse Engineering,我正在读一个数据库文件,其中包含Ruby中十六进制的动态大小列。我可以使用以下脚本成功地将文件拆分为记录: open_file = IO.binread(path + file_name) record_delimeters = ['FAFA', 'FEFE', 'FDFD'] # regex with bytes is kinda finicky.. So I went this route to avoid the pitfalls of escape characters and gsu

我正在读一个数据库文件,其中包含Ruby中十六进制的动态大小列。我可以使用以下脚本成功地将文件拆分为记录:

open_file = IO.binread(path + file_name)
record_delimeters = ['FAFA', 'FEFE', 'FDFD']

# regex with bytes is kinda finicky.. So I went this route to avoid the pitfalls of escape characters and gsub... If anyone knows a better way to do this part, I am up for suggestions as well..
final_reg = '['
record_delimeters.each_with_index do |delim, index|
  standard_string = '\xFA-\xFA'
  standard_string[2,2] = delim[0,2]
  standard_string[7,2] = delim[2,2]
  unless index == 0
    final_reg += '|'
  end
  final_reg += standard_string
end

final_reg += ']+'

reg = Regexp.new final_reg.encode('UTF-8'), Regexp::IGNORECASE | Regexp::MULTILINE, 'n'

records = open_file.split(reg);nil
但是,我希望保留分隔符作为引用,因为分隔符表示记录的所有“类型”内容。例如:uint、int、word等

最终,我希望记录看起来像这样:

 ["\xFE\xFE\x00\xF4\x35...", "\xFA\xFA\x03\x4F\x7A...", ...]
或者这个:

 ["\xFE\xFE", "\x00\xF4\x35...", "\xFA\xFA", "\x03\x4F\x7A...", ...]
但绝对不是这个(这就是我所拥有的):


注意文档中的状态:“如果[regex]模式包含组,那么相应的匹配项也将在数组中返回。”。这有用吗?旁白:你可以写:
final_reg+='.|',除非index==0
open_file.split(/(?=\xFA\xFA\xFD\xFD\xFE\xFE)/n)
?@cremno效果很好。@Cary Swoveland我感谢你的帮助。你为什么在我的另一个问题上写下你的帖子?很高兴知道。我不确定我是否理解手动正则表达式构建背后的意图。它相当于
/[\xFA-\xFA |\xFE-\xFE |\xFD-\xFD]+/imn
,这很奇怪:
\xFA-\xFA
与刚才的
\xFA
相同,它匹配
,为什么是ignorecase和multiline?
 ["\x00\xF4\x35...", "\x03\x4F\x7A...", ...]