`cat image.png`的输出是什么?

当你做cat image.png时输出意味着什么? 这是图像实际上是由什么组成的? 图像的文件扩展名是否重要?

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 .............WR 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`. 

要获取文件内容的hex转储,请注意第一行中的“PNG”。

从这里我们可以看到PNG签名是:

 PNG 89 50 4E 47 0D 0A 1A 0A PNG image 

cat只是将文件的内容输出到stdout 流 ,在你的情况下恰好是终端。 组成文件的0和1的序列发生在终端上。 在二进制文件的情况下,不是文本的位序列将不被识别为文本。

例如,考虑使用具有UTF字符的文件,例如两个不同终端中的中文 – 一个支持UTF字符(下面屏幕截图中的terminator )和一个没有良好支持的文件( xterm在下面的屏幕截图中) )。 正如您所看到的,某些字符未被解释。 cat将在任何一种情况下输出内容,但如何解释这些内容 – 这取决于每个终端。

在此处输入图像描述

现在,如果将stdout流重定向到文件,则可以有效地创建副本,与cp original copymv old new几乎相同。 在极少数情况下,您可能希望拼接两个文件 – 二进制文件或文本 – 这也可能与cat 。 这个想法是一样的。 根据POSIX定义 ,“输入文件可以是任何文件类型”,这意味着cat可以读取任何文件。 但是,有些情况下cat会采用文本模式。 如果是Ubuntu的cat (由GNU coreutils包提供)信息在info cat状态中提供:

如果使用其中一个选项’-bensAE’或’cat’正在从标准输入读取而标准输入是终端,则’cat’以文本模式读取。 类似地,如果使用其中一个选项’-bensAE’或标准输出是终端,’cat’会以文本模式写入。

当然,如果我们真的想以可读格式查看二进制文件的内容,我们可以使用hex编辑器或任何“转储”类型的程序, Midnight Commander文件管理器,甚至vi文本编辑器 。 这里和这里已有很好的清单。

图像由字节组成。 文本文件也是如此

当软件应用程序(例如cat想要读取文本文件时,它会开始读取字节并在字符编码中搜索这些字节,例如ascii或unicode。 它在表中找到该字符并进行渲染。

但是图像没有字符(它们可能但不是构建图像的那些),你可以猜测当你尝试将图像格式化的字节视为字符时会发生什么。 你得到每个文件的随机字符。

如果要查看文件的字符串,请使用strings命令。