我有一个二进制文件,我不知道里面是什么。然后,我使用binary scan $bin_data "H*" hex_data
将其转换为十六进制数。问题是如何匹配任何重复模式(字节)。
在文件中:0cabab79
预期输出:abab
在文件中:0c1f1f03035d
预期输出:1f1f0303
在文件中:0c678967895d13
预期输出:67896789
答案 0 :(得分:1)
您可以使用更灵活的正则表达式来获取所有重复的模式(至少2个字符):
set inputs [list 0cabab79 0c1f1f03035d 0c678967895d13]
foreach input $inputs {
set out ""
foreach {whole sub} [regexp -all -inline {(..+)\1} $input] {
append out $whole
}
puts $out
}
# Output:
# abab
# 1f1f0303
# 67896789
如果你想确保模式是偶数个字符对(即aaaaaa
应该给aaaa
而不是aaaaaa
),那么......
set inputs [list 0cabab79 0c1f1f03035d 0c678967895d13 aaaaaa]
foreach input $inputs {
set out ""
foreach {whole sub} [regexp -all -inline {((?:..)+)\1} $input] {
append out $whole
}
puts $out
}
# Output:
# abab
# 1f1f0303
# 67896789
# aaaa
答案 1 :(得分:0)
您可以使用反向引用使用正则表达式执行此操作:
regexp -all -inline {(..)\1} 0c1f1f03035d
这将返回一个包含全长重复的列表,后面跟着所有匹配的重复元素 所以对于这个你会得到
1f1f 1f 0303 03
循环使用这些可以构建预期输出,例如
set op {};
foreach {rep sing} [regexp -all -inline {(..)\1} 0c1f1f03035d] {
append op $rep
}