【发布时间】:2019-01-05 23:35:42
【问题描述】:
对于二进制文件,我想提取绿色(日期和小时)和蓝色的十六进制字符串。蓝色的十六进制字符串在字节 09 和 00 之间。
我已经能够使用正则表达式提取日期和小时以及部分蓝色的十六进制字符串。为此,我将字节 09 (\x09)
设置为“行分隔符”我可能遇到的问题可以用正则表达式来解决,以获取 09 和 00 之间的字符串,但目前使用我的正则表达式 (^20.*) 我变得不受欢迎 和非ASCII字节。有人可以帮我获取 09 到 00 之间的字节数。
我当前的代码:
BEGIN{ $/="\x09".force_encoding("BINARY") }
IO.foreach("file.dat"){ |l|
line = l.unpack('H*')[0]
next unless line =~ /(.{8}2d.{4}2d.{4})20(.{4}3a.{4}3a.{4})|(^20.*)/
if ( $1 != nil and $2 != nil )
date = $1
hour = $2
p date.gsub(/../) { |b| b.hex.chr }
p hour.gsub(/../) { |b| b.hex.chr }
end
if $3 != nil
p $3.gsub(/20/,"").gsub(/../) { |b| b.hex.chr }
end
}
电流输出
"2017-10-19"
"15:43:27"
"83492624790981030E100000\x00\x18\v\x16\x84\x13\x05$B#q\x000\x03\x81\x01\n\x00\x00v\x00\x0000000003\t"
"2017-12-05"
"09:32:15"
"001104059419632801001B237100300381010A0000\x00\x00\x00\x00\x02\xD0\x00\x00\x00\b\xFEF\xCC\x00\x06\xE7\f\x13\x0F+\e\xB5\xE1/\x00\xB5\x83I&$y\t"
=> nil
预期输出
"2017-10-19"
"15:43:27"
"83492624790981030E100000"
"2017-12-05"
"09:32:15"
"001104059419632801001B237100300381010A0000"
=> nil
附加示例文件: file.dat
【问题讨论】:
-
尝试类似:
s.each_byte.map { |b| b.to_s(16) }.join -
嗨 Aaditya,我已经像这样测试过,但不起作用,打印错误 3 美元
p $3.each_byte.map { |b| b.to_s(16) }.join
标签: ruby binary-data data-extraction