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

Unix:在 ppm 文件上使用 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
...
...

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

答案1

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

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

在你的第一行:

00000000: 5036 0a31 3131 2031 3332 0a32 3535 0a55  P6.111 132.255.U

偏移量00000000为零,因为这是开始;5036、 和是、、 和换行符等的0a字符代码。不可打印的字符在右侧列上打印为点。P6


注意,在一些变体中,中间部分中的字节可以在每个组内“反转”。如果程序将输入解释为小端数字,并按此方式显示它们,而不是显示为连接的各个字节,则会发生这种情况。

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

$ printf  "ABCD" | xxd -e -g2 
00000000: 4241 4443                                ABCD

41forA42forB以及其他两个以相反的顺序出现。odGNU coreutils 还反转组内的字节。如有疑问,请仔细检查,或争取进行一对一的分组。 (比较例如od -xod -tx1在此。)


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

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

答案2

它是一个十六进制转储,采用相当常见的十六进制转储格式,每行输出包含字节偏移量(十六进制*)、16 字节的十六进制数字以及这些相同字节的 ASCII 表示形式。

* 请注意每行字节偏移量如何递增 0x10 十六进制(十进制 16)。

man xxd

姓名

   xxd - make a hexdump or do the reverse.

概要

   xxd -h[elp]
   xxd [options] [infile [outfile]]
   xxd -r[evert] [options] [infile [outfile]]

描述

xxd 创建给定文件或标准输入的十六进制转储。它还可以将十六进制转储转换回其原始二进制形式。与uuencode(1) 和(1)一样uudecode,它允许以“邮件安全”ASCII 表示形式传输二进制数据,但具有解码为标准输出的优点。此外,它还可用于执行二进制文件修补。 [...]

当您需要确切知道文件中某个确切位置的字节数时,十六进制转储非常有用。它们可以帮助诊断问题,例如,文件中存在意外字节(例如 NUL ( 0x00) 或回车符 ( ) ),并且正如@ilkkachu 在他的回答中提到的,如果二进制文件格式已记录(或者您碰巧0x0D无论如何都知道),通常可以解释特定偏移(位置)中字节的特定含义。

相关内容