为啥以文本形式打开图像文件会打印出奇怪的字符?

Posted

技术标签:

【中文标题】为啥以文本形式打开图像文件会打印出奇怪的字符?【英文标题】:Why does opening an image file as text prints weird characters?为什么以文本形式打开图像文件会打印出奇怪的字符? 【发布时间】:2017-06-14 23:53:42 【问题描述】:

每当我打开 jpeg、png、ico 等时,它总是会打印出来。为什么我打开它,因为我认为每个软件都有代码,但那些处理图像或颜色的软件恰好是奇怪的东西?那么谁能解释一下?

MZ       ÿÿ  ¸       @                                   €   º ´    Í!  ¸      LÍ!This program cannot be run in DOS mode.

$       PE  L OhAY        à   8         þU       `    @                                  @…                           °U  K    `  ø                   €                                                                       H           .text   6       8                    `.rsrc   ø   `        :              @  @.reloc      €      >              @  B                àU       H     ¸+  ø)                                                       0      %  
(  
*  0! 4    r  p  
(  
Ð  r  pr  p  %r-  p¢%r1  p¢%r;  p¢%rE  p¢%rQ  p¢  %r-  pÐ  s  
¢%r1  pÐ  s  
¢%r;  pÐ  s  
¢%rE  pÐ  s  
¢%rQ  pÐ  s  
¢%r]  pÐ  s  
¢%re  pÐ  s  
¢r  p  
(

【问题讨论】:

谷歌:“什么是二进制”、“什么是数据”、“什么是文件格式”。图像是标准文件格式的二进制数据。图片应用是代码而不是图片。 【参考方案1】:

只有纯文本文件存储在纯文本中。图像、程序、视频、音乐和大多数其他文件都以各种二进制格式存储。当您在文本编辑器中打开二进制文件时,它假定您告诉它打开的文件是纯文本并开始读取其中的数据。文本编辑器读取每个数据块(可以将其视为一系列数字)按顺序将数据转换为相应的文本字符。由于文件中的数据是二进制的,因此数据不打算显示为字符,我们会看到大量随机字符。这是一个相当大的简化,但已经足够接近,应该可以帮助您理解。

如您所见,该格式中还必须存储一些纯文本,因为我们可以读取This program cannot be run in DOS mode. 和其他一些随机文本。

此外,您计算机上的文件不是程序,除非它们以.exe 结尾(这也是一种简化,但足够接近)。例如,双击图像文件会告诉操作系统启动图像编辑程序,而操作系统会告诉程序打开图像。图片本身不是程序。

不过,我建议您阅读以下内容:How do I ask a good question? 这个问题可能更适合https://superuser.com/。


值得一提的是,从技术上讲,每个文件都存储在二进制文件中,甚至是纯文本文件。纯文本编辑器期望文件的每个字节对应一个字符(通常来自ASCII table)。当您在纯文本编辑器中打开图像文件时,它会尝试将图像文件的每个字节解释为文本,但图像文件中的字节不打算作为字符读取,因此它们会作为无意义的字符出现。

这就像查看时钟并将当前时间的每个数字(例如 9:23)替换为字母表中的一个字母。字母表的第 9 个字母是 I,第 2 个是 B,第 3 个是 C,这就是 IBC。 “但那不是一个字!”你可能会说。当然不是。我们只是试图把时间读成字母,结果它就变成了无稽之谈。这基本上是在文本编辑器中打开图像文件时发生的情况。

【讨论】:

以上是关于为啥以文本形式打开图像文件会打印出奇怪的字符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的图像在这些奇怪的字符中回响?

图像映射:单击以在屏幕上回显/打印文本

opencv打印奇怪的黑色图像

将图像数据写入文本文件以创建 BMP 文件

《程序是怎样跑起来的》第六章读后感

以字符串形式打印出的 C++ 整数位?