我认为这里对层顺序的描述令人困惑。我会认为格式和编码是相关的,但不会紧密联系在一起。让我们尝试正式定义它。
文件是连续的字节序列。一个字节是一个连续的位序列。
符号是数据的单位。字节是一种符号。还有其他不是字节的符号。考虑数字 6 - 它是一个符号,但不是一个字节。然而,它可以被编码为一个字节,通常为00000110
(这是 6 的二进制补码编码)。
编码将一组符号映射到另一组符号。最常见的是,它从一组非字节符号映射到字节,当应用于整个文件时,它会成为文件编码。二进制补码给出数值的表示。另一方面,例如,ASCII 以字节表示拉丁字母和相关字符。如果你把 ASCII 应用到一个文本字符串上,比如“Hello, World!”,你会得到一个字节序列。如果将此字节序列存储为文件,则文件编码为 ASCII。
格式描述了一组有效的符号序列。当应用于文件的字节时,它是一种文件格式。一个例子是用于存储光栅图形的 BMP 文件格式。它指定开头必须有几个字节来标识文件格式为 BMP,后跟几个字节来描述图像的大小和深度,依此类推。不是文件格式的格式示例是我们如何用英语编写十进制数字。基本格式是一系列数字字符,后跟一个可选的小数点和更多的数字字符。
文本文件
文本文件是一种格式非常简单的文件。它的格式非常简单,因为它没有结构。它立即以字符的某种编码开始,并以最终字符的编码结束。通常没有页眉或页脚或元数据或类似的东西。您只需从头开始将字节解释为字符。
但是你如何解释文件中的字符呢?这就是编码的用武之地。如果文件被编码为 ASCII,则该字节01000001
表示拉丁字母 A。还有更复杂的编码,例如 UTF-8。在 UTF-8 中,字符不一定用单个字节表示。有些可以,有些不能。您从第一个字节的前几位确定要解释为字符的字节数。
当您在您最喜欢的文本编辑器中打开文件时,它如何知道如何解释字节?嗯,这是一个有趣的问题。文本编辑器必须确定文件的编码。它可以尝试以多种方式做到这一点。有时文件名通过其扩展名给出提示(.txt
可能至少与 ASCII 兼容)。有时文件的第一个字符可以很好地提示编码是什么。但是,大多数文本编辑器都会让您选择指定将文件视为哪种编码。
文本文件可以有格式。通常格式完全独立于文本的编码。也就是说,格式根本没有描述有效的字节序列。相反,它描述了有效的字符序列。例如,HTML 是一种用于标记文档的文本文件格式。它描述了确定文档内容的字符序列(注意:不是字节序列)。例如,它表示字符序列<html>
是一个开始标签,并且必须在某个点后跟结束标签</html>
。当然,格式比这要详细得多。
二进制文件
二进制文件是具有由其文件格式决定的含义的文件。文件格式描述了文件中有效的字节序列以及该序列的含义。在文件格式级别重要的不是对字节的某种解释——而是字节的顺序和排列。
如上所述,BMP 文件格式提供了一种存储光栅图形的方法。它说前两个字节必须是01000010 01001101
,接下来的四个字节必须给出文件的大小作为字节数的计数,依此类推,直到实际的像素数据。
二进制文件可以在其中包含编码。为了说明这一点,请考虑前面的示例。我说过 BMP 文件中前两个字节后面的四个字节给出了文件的大小(以字节为单位)。这些字节是如何解释的?BMP 文件格式声明这些字节将大小作为无符号整数给出。这是这些字节的编码。
因此,当您浏览计算机上的目录以查找 BMP 文件并打开它时,您的系统如何知道如何打开它?它如何知道使用哪个程序来查看它?与文本文件的编码相比,文件扩展名更强烈地暗示二进制文件的格式。如果文件名.bmp
末尾有,您的系统可能会认为它是一个 BMP 文件,只需在您拥有的任何图形程序中打开它即可。它还可能会查看前几个字节并查看它们的建议。
概括
理解文件中字节含义的第一层次是该文件的格式。文本文件的格式非常简单——从头开始,解释字符直到结束。您如何解释字符取决于该文本文件的字符编码。然而,大多数格式都更复杂,并且可能会在其中嵌套编码。在某种程度上,你必须开始从你的字节中提取抽象信息,这就是编码开始的地方。但是任何被编码的东西也可以有一个应用到它的格式。在获得所需信息之前,您拥有一系列格式和编码。