如何在ruby中拆分字节序列并保留delimeter?
我正在读一个数据库文件,其中包含Ruby中十六进制的动态大小列。我可以使用以下脚本成功地将文件拆分为记录:如何在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
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...", ...]