当你这样做时,输出的含义是什么cat image.png
?
这幅图像实际上是由这个构成的吗?
图像的文件扩展名重要吗?
答案1
cat
将打印出文件的内容(零和一将被映射到无意义的字符,因为它们不是真正的字符,对吧?)stdout
默认情况下,这是您的终端。
文件扩展名可以帮助我们(人类)轻松判断文件的类型;有些程序也使用它来打开文件,但大多数程序使用文件内部的标题来检测文件类型。
用于file file.png
获取文件类型,或者xxd file.png
:
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 0002 0000 0002 0800 0000 0057 dd52 .............W.R
00000020: f800 0000 0e49 4441 5478 9c63 6c60 6062 .....IDATx.cl``b
00000030: 6000 0002 9200 84f7 7ca3 5800 0000 0049 `.......|.X....I
00000040: 454e 44ae 4260 82 END.B`.
要获取文件内容的十六进制转储,请注意第一行中的“PNG”。
更多来自此文件签名参考我们可以看到 PNG 签名是:
PNG 89 50 4E 47 0D 0A 1A 0A PNG image
答案2
cat
只是将文件内容输出到stdout
溪流,在您的情况下恰好是终端。组成文件的 0 和 1 序列会发生什么情况取决于终端。对于二进制文件,不是文本的位序列将不会被识别为文本。
例如,考虑cat
在两个不同的终端中输入包含 UTF 字符(如中文)的文件 - 一个支持 UTF 字符(terminator
如下图所示),另一个不支持(xterm
如下图所示)。如您所见,有些字符未被解释。cat
无论哪种情况,都会输出内容,但如何解释这些内容 - 取决于每个终端。
现在,如果你将stdout
流重定向到文件,你实际上是在创建一个副本,与cp original copy
或非常相似mv old new
。在极少数情况下,你可能想要拼接两个文件- 二进制或文本 - 也可以使用cat
。 思路是一样的。 按照POSIX 定义,“[输入文件可以是任何文件类型]”,这意味着cat
可以读取任何文件。但是,有些情况下cat
会采用文本模式。以 Ubuntu 为例cat
(由 GNU coreutils 包提供),提供的信息如下info cat
:
如果使用其中一个选项 '-bensAE',或者 'cat' 从标准输入读取并且标准输入是终端,则 'cat' 以文本模式读取。同样,如果使用其中一个选项 '-bensAE',或者标准输出是终端,则 'cat' 以文本模式写入。
当然,如果我们真的想以可读格式查看二进制文件的内容,我们可以使用十六进制编辑器或任何“转储”类型的程序,午夜指挥官文件管理器,甚至vi
文本编辑器。这些有一个很好的清单这里和这里已经。
答案3
图像由字节组成。文本文件也是如此。
例如,当软件应用程序cat
想要读取文本文件时,它会开始读取字节,并在字符编码(如 ascii 或 unicode)中搜索这些字节。它会在表中查找字符并呈现它。
但是图像没有字符(它们可能有,但这不是构建图像的原因),您可以猜测当您尝试将图像格式的字节视为字符时会发生什么。您会得到每个文件的随机字符。
如果您想查看文件的字符串,请使用strings
命令。