1

我需要特定格式的许多文件的 hexdumps:

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00

但是,使用 hexdump 或 xxd 我只能设法在地址后面加上冒号和右边的 ASCII 文本,例如:

00000000: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 
MZ..............

我使用命令得到了上述内容

xxd -g 1 -u filename

有任何想法吗?

4

2 回答 2

2

hexdump一旦您弄清楚有点神秘但功能强大的格式语法,就能够产生此输出并提供更多选项。

$ hexdump -v -e '"%08_ax" 16/1 " %02X" "\n"' en.gif 
00000000 47 49 46 38 37 61 10 00 0A 00 A1 03 00 CC 00 00
00000010 44 44 CC FF FF FF FF BB 66 2C 00 00 00 00 10 00
00000020 0A 00 00 02 25 8C 20 61 A8 97 BA 92 8B 10 BA CB
00000030 AA 45 FC 59 01 82 C0 18 96 E3 89 A6 64 79 AC 6C
00000040 E5 74 DA 26 D6 F3 84 67 41 01 00 3B

详细格式:

  • "%08_ax"是十六进制的偏移量,8 位数字,前导零。
  • 16/1 " %02X"每次迭代(行)显示 16 个字节,每个块一个字节,每个块格式化为 2 个大写十六进制数字,前导零和前面的空格。
  • "\n"用换行符完成每次迭代(行)。
于 2019-08-08T20:36:31.840 回答
2

od是一种方式:

通过创建示例文件后

perl -e 'print map { chr hex } @ARGV' 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 > foo.bin

得到它的十六进制转储:

$ od -Ax -t x1 foo.bin
0000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
0000010

这里的关键是-t FORMAT论证。在格式中,x使用基数 16,1表示每个块打印一个字节。表示以 16 为基数而不是默认的-Ax以 8 为基数打印偏移量。

head -n -1它确实将文件末尾的偏移量打印为最后一行,但如果不需要,这很容易摆脱。似乎没有办法让它使用大写十六进制数字,但如果你喜欢它们也很容易修复:

$ od -Ax -t x1 foo.bin | head -n -1 | tr a-f A-F
000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
于 2019-08-08T11:28:39.447 回答