Unix:在 ppm 文件上使用 xxd 命令

Sho*_*med 2 files xxd

我对 unix 相当陌生,并且无法理解某些命令的作用。例如,当我xxd在 ppm 文件(即xxd image.ppm)上使用时,我得到如下输出:

00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U
00000010: 6137 5966 3958 6939 566a 3953 6739 5464  a7Yf9Xi9Vj9Sg9Td
00000020: 3b57 643a 5763 3654 6335 5161 334e 5c30  ;Wd:Wc6Tc5Qa3N\0
00000030: 4f5a 3250 5d35 5361 3556 6334 5561 3352  OZ2P]5Sa5Vc4Ua3R
00000040: 5e32 515d 3256 6035 5b64 3856 6136 4a55  ^2Q]2V`5[d8Va6JU
...
...
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这个输出代表什么吗?

ilk*_*chu 6

这三个部分是从输入开始的偏移量,以十六进制表示;十六进制数据;和字符数据,如果它们是可打印的。一行 16 个字节,因为它是一个很好的整数,并且非常适合屏幕。

在二进制和文本数据都可能很重要的情况下,经常使用这样的显示。例如tcpdump -X 使用类似的。

在你的第一行:

00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U
Run Code Online (Sandbox Code Playgroud)

偏移量00000000为零,因为这是开始;50, 36, and0aP, 6, 和换行符等的字符代码。无法打印的字符在右侧列打印为点。


请注意,在某些变体中,中间部分的字节可能在每个组内“反转”。如果程序将输入解释为 little-endian 数字,并按原样显示它们,而不是将单个字节连接起来,就会发生这种情况。

xxd -e正是这样做的。考虑:

$ printf  "ABCD" | xxd -e -g2 
00000000: 4241 4443                                ABCD
Run Code Online (Sandbox Code Playgroud)

41forA42forB以倒序出现,另外两个也一样。od来自 GNU coreutils 也反转组内的字节。如有疑问,请仔细检查,或旨在获得一对一的分组。(比较例如od -xod -tx1在这个。)


当然,数据本身的含义可以从 ppm 格式的文档中找到。我的系统有手册页ppm(5)。(die.net上的在线版本已损坏格式。)

从第一行我们可以看出这是一张大小为 111x132 像素的 RGB 图片,每个样本为 8 位。