![查找二进制文件中特定类型的数据块的字节偏移量值,但会跳过包含大于 127 [或 0x7F] 的任何字节的块](https://linux22.com/image/1670133/%E6%9F%A5%E6%89%BE%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E4%B8%AD%E7%89%B9%E5%AE%9A%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%95%B0%E6%8D%AE%E5%9D%97%E7%9A%84%E5%AD%97%E8%8A%82%E5%81%8F%E7%A7%BB%E9%87%8F%E5%80%BC%EF%BC%8C%E4%BD%86%E4%BC%9A%E8%B7%B3%E8%BF%87%E5%8C%85%E5%90%AB%E5%A4%A7%E4%BA%8E%20127%20%5B%E6%88%96%200x7F%5D%20%E7%9A%84%E4%BB%BB%E4%BD%95%E5%AD%97%E8%8A%82%E7%9A%84%E5%9D%97.png)
我有一个包含数据块的二进制文件。每个块的前四个字节包含一个固定字节字符串,之后的五个字节包含块的“类型”字节。我想找出特定类型的每个块的字节偏移量。因此我执行了以下命令(请注意,我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