我有一个包含数据块的二进制文件。每个块的前四个字节包含一个固定字节字符串,之后的五个字节包含块的“类型”字节。我想找出特定类型的每个块的字节偏移量。因此我执行了以下命令(请注意,我head
在这里使用以使我的代码片段简短):
$ grep -oaPb '(\x0b\x0c\x0d\x0e)' input.bin | head -n4 | cut -d: -f1
0
58
137
281
这将为我提供文件中所有数据块的字节偏移量。查看十六进制编辑器...
- 偏移量 0 处的块 = 类型
0x0440
- 偏移量 58 处的块 = 类型
0x0540
- 偏移量 137 处的块 = 类型
0x0541
- 偏移量 281 处的块 = 类型
0x0C80
我想过滤类型0x0541
,因此我接下来执行了此操作,但它跳过了许多块。不过,当我使用编辑器检查时,它们在技术上仍然是正确的:
$ grep -oaPb '(\x0b\x0c\x0d\x0e)[\x00-\xFF]{5}(\x05\x41)' input.bin | head -n4 | cut -d: -f1
3173
4617
14078
15959
我确信偏移量为 137 的块属于 类型0x0541
,那么这里发生了什么?如能得到帮助,我将不胜感激!
编辑:经过进一步的修改,我发现表达式的这一部分[\x00-\xFF]{5}
忽略了包含大于 的值的任何匹配0x7F
,因此它似乎使用了有符号的值范围(-128 到 127 [0x7F])。我想现在的问题是,我该如何让它使用无符号的范围?
编辑 2:事实证明解决方案是使用LC_ALL=c
......
$ LC_ALL=c grep -oaPb '(\x0b\x0c\x0d\x0e)[\x00-\xFF]{5}(\x05\x41)' input.bin | head -n4 | cut -d: -f1
137
3173
4617
14078