“cat image.png” 的输出是什么?

“cat image.png” 的输出是什么?

当你这样做时,输出的含义是什么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命令。

相关内容