【问题标题】:How to get specific format using hexdump or xxd?如何使用 hexdump 或 xxd 获取特定格式?
【发布时间】:2019-08-08 11:08:42
【问题描述】:

我需要一些特定格式的文件的十六进制转储:

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

有什么想法吗?

【问题讨论】:

  • Any ideas? - 是的,把它带到它所属的 superuser.com,这个问题与编程无关。
  • unix.stackexchange.com。最有可能的答案是“阅读手册页”。
  • od -t x1 filename
  • @Shawn 我在运行该命令时最后得到了一些额外的文本,i.imgur.com/qTGfhFj.png
  • @ICEpower 我在我的答案中添加了一些内容,包括如何在需要时获得大写输出以及如何摆脱od 在不需要时总是打印的最后一行.

标签: linux hexdump xxd


【解决方案1】:

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 表示每个块打印一个字节。 -Ax 表示以 16 为基数而不是默认的以 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

【讨论】:

  • 完美!我不需要结束偏移量,也需要大写十六进制数字,所以感谢添加这些!
【解决方案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" 以换行符结束每次迭代(行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2014-12-03
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多