【发布时间】:2021-03-16 14:25:14
【问题描述】:
我正在尝试查找 txt 格式的字符串,每次找到它时,都会查找要更改为另一个字符串的特定字符串。此外,该字符串后面是十六进制 txt 的长度
想象下一个十六进制 txt:
示例 1:
09 06 07 04 00 00 01 00 1d 03 4b 2c a1 2a 02 01
b7 09 01 47 30 22 a0 0a 80 08 33 04 03 92 22 14
17 f0 a1 0b 80 00 81 00 84 01 00 86 00 85 00 83
07 91 94 71 06 00 07 19
示例 2:
09 06 07 04 00 00 01 00 2b 03 4b 27 a1 25 02 01
00 09 01 66 30 1d a0 0a 80 08 33 04 03 92 22 14
17 f0 a1 06 82 00 84 00 85 00 82 07 91 94 71 06
00 07 19
我需要每次遇到 4b 序列时查找 09 01 序列并替换为 03 02。这仅在 4b 后面的十六进制值是剩余序列的总长度时才有效。在第一种情况下,2c 表示两行和 12 个十六进制值(2c-> 两行和 12 个十六进制值[c=12 in hexadecimal])。第二种情况,27代表两行,7个十六进制值。
我正在尝试这样的事情,但我不知道如何检查十六进制长度
gawk -i inplace ' { for ( i = 1; i <= NF; ++i ) {
if ( $i == "4b" )
r = 1
if ( r && $i == "09" && $(i+1) == "01" ) {
r = 0
$i = "03"
$++i = "02"
}
}
}
1 ' hexadecimal.txt
提前致谢
问题 2-十六进制数组:
'正在尝试以 txt 格式查找字符串 1,每次找到它时,然后查找特定字符串 2 以更改为另一个字符串 3。但是,我们必须注意剩余序列的长度。我的意思是,字符串 1 后面的总是十六进制的静止序列的长度。因此,由于字符串 1 可以多次出现,我想检查它后面的十六进制数是否是剩余序列的长度。
我需要每次遇到5a序列寻找06 01序列并替换为02 01。这只有在5a后面的十六进制值是剩余序列的总长度时才有效
想象下一个十六进制 txt:
76 9d 6c 17 09 01 03 0e 19 0b 12 06 00 12 04 25 55 21 32 25 80 0b 12 93 00 12 04 94 71 06 00 07 19 56 62 54 48 04 00 00 00 01 6b 1e 28 1c 06 07 00 11 86 05 01 01 01 a0 11 60 0f 80 02 07 80 a1 09 06 07 04 00 00 01 00 1d 03 5a 2c a1 2a 02 01 b2 06 01 47 30 22 a0 0a 80 08 33 04 03 92 22 14 17 f0 a1 0b 80 00 81 00 84 01 00 86 00 82 22 83 07 91 94 71 06 00 08 69
00 11 86 05 01 01 01 a0 11 60 0f 58 02 07 80 a1 09 06 07 04 00 23 01 22 2b 03 5a 27 a9 25 02 01 00 02 01 3e 30 1d 22 0a 80 08 33 04 03 92 22 14 17 f0 a1 06 82 00 84 00 85 00 82 07 91 94 71 06 00 07 19
09 06 07 04 00 00 01 00 2b 03 5a 27 a1 25 02 01 00 06 01 66 30 1d a0 0a 80 08 33 04 03 92 22 14 17 f0 a1 06 22 00 22 00 85 00 82 07 91 94 71 06 00 07 19
解释:
第一段:2c表示剩余序列的长度,即两行12个十六进制值(2c=两行12个十六进制值[c=12 in hexadecimal])
第二段:27代表两行7位十六进制值。
第三段:27代表两行7位十六进制值。
【问题讨论】:
-
请解释一下
(length of the) resting sequence的意思;另外,2c和27指的是输入数据的哪一部分(即line和hexa指的是什么)? -
一个序列(例如,
4b)能否在数据中多次出现? -
在开发脚本时不要使用
-i inplace。先得到你想要的输出,然后再添加-i inplace。它根本不需要成为您问题的一部分。用列和行中的字符串来写你的问题——不要假设我们知道什么是“hexa”和“resting sequence”或任何其他特定于你的域的术语,否则你会严重限制将成为能够帮助你。 -
@markp-fuso (the length of the) 静止序列是指剩下多少个十六进制值。 2c 表示序列的长度。如果你看一下 2c,你有 2 行完整的十六进制参数和 12 个十六进制值(c=12)。 27 也是如此。4b 可以多次出现,这就是为什么我想用 4b 后面的十六进制值进行检查
-
我认为描述
2c和27的更好方法是: 文件的内容是两位十六进制代码;2c和27表示文件中剩余的十六进制代码的数量,即2c(hex) == 44(decimal)=> 文件中剩余的44个2位十六进制代码(在2c之后)