我正在生成二进制数据文件,这些文件只是连接在一起的一系列记录。每条记录包含一个(二进制)标题,后跟二进制数据。在二进制头内是一个长度为80个字符的ascii字符串。在某个地方,我编写文件的过程有点搞砸了,我试图通过检查每条记录的实际长度来调试这个问题。
This似乎非常相关,但我不懂perl,所以我无法在那里得到公认的答案。另一个答案指向我编译的bgrep
,但它希望我提供一个十六进制字符串,我宁愿只有一个工具,我可以给它ascii字符串,它会在二进制数据中找到它,打印字符串和找到它的字节偏移量。
换句话说,我正在寻找一些像这样的工具:
tool foobar filename
要么
tool foobar < filename
它的输出是这样的:
foobar:10
foobar:410
foobar:810
foobar:1210
...
例如匹配的字符串和匹配开始的文件中的字节偏移量。在这个示例中,我可以推断每条记录的长度为400字节。
其他限制:
你可以使用strings
:
strings -a -t x filename | grep foobar
用GNU binutils测试。
例如,在/bin/ls
发生--help
的地方:
strings -a -t x /bin/ls | grep -- --help
输出:
14938 Try `%s --help' for more information.
162f0 --help display this help and exit
grep --byte-offset --only-matching --text foobar filename
--byte-offset
选项打印每个匹配行的偏移量。
--only-matching
选项使其为每个匹配实例而不是每个匹配行打印偏移量。
--text
选项使grep将二进制文件视为文本文件。
您可以将其缩短为:
grep -oba foobar filename
它适用于grep
的GNU版本,默认情况下它带有linux。它不适用于BSD grep(默认情况下附带Mac)。
我想做同样的任务。虽然字符串| grep工作,我发现gsar是我需要的工具。
输出如下:
>gsar.exe -bic -sfoobar filename.bin
filename.bin: 0x34b5: AAA foobar BBB
filename.bin: 0x56a0: foobar DDD
filename.bin: 2 matches found