我对 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
为零,因为这是开始;50
、36
、 和是、、 和换行符等的0a
字符代码。不可打印的字符在右侧列上打印为点。P
6
注意,在一些变体中,中间部分中的字节可以在每个组内“反转”。如果程序将输入解释为小端数字,并按此方式显示它们,而不是显示为连接的各个字节,则会发生这种情况。
xxd -e
正是这样做的。考虑:
$ printf "ABCD" | xxd -e -g2
00000000: 4241 4443 ABCD
41
forA
和42
forB
以及其他两个以相反的顺序出现。od
GNU coreutils 还反转组内的字节。如有疑问,请仔细检查,或争取进行一对一的分组。 (比较例如od -x
和od -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
无论如何都知道),通常可以解释特定偏移(位置)中字节的特定含义。