如何在 macOS 上将“\x”插入 hexdump 格式字符串?

How to insert "\x" into a hexdump format string on macOS?

我一直在 Linux 上使用下面的 hexdump 格式字符串来以 C 风格的十六进制格式显示二进制文件的内容 \xXX\xXX...:

$ hexdump -v -e '1/1 "\x%02x"' file.bin
hexdump: %?: bad conversion character

但是,如上所示,\ 中的 \ 没有正确转义,导致错误。

我该如何解决这个问题?

Hexdump 问题仅限 Macos

这个问题曾经是 debian 上的一个 hexdump bug,但已修复。我已经在 FreeBSD 上对此进行了测试,它已在 October 29, 2014 版本的 hexdump 中得到修复。

MacOS 上的 BSD hexdump 版本(参见 man hexdump)自 July 10, 2004 以来未更新,仍然存在此问题。有关尝试查找 Macos 实用程序版本的更多信息, 关于 sed 很有帮助。

十六进制转储

我们可以通过将 \x 放在单独的格式字符串中来绕过它。有关为什么需要这样做的更多信息, 关于转义制表符很有用。

hexdump -v -e '"\\x" 1/1 "%02x"' $file

需要三个反斜杠才能获得 \ 后跟 x 的文字。

xxd

为了完整起见,xxd 实现需要更多步骤,但不需要格式化字符串恶作剧:

xxd -p $file | tr -d '\n' | sed 's/\(..\)/\x/g'