查找二进制文件中特定类型的数据块的字节偏移量值,但会跳过包含大于 127 [或 0x7F] 的任何字节的块

查找二进制文件中特定类型的数据块的字节偏移量值,但会跳过包含大于 127 [或 0x7F] 的任何字节的块

我有一个包含数据块的二进制文件。每个块的前四个字节包含一个固定字节字符串,之后的五个字节包含块的“类型”字节。我想找出特定类型的每个块的字节偏移量。因此我执行了以下命令(请注意,我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

相关内容