文本文件和二进制文件的区别

55

在传输文件时,为什么要区分文本文件和二进制文件?为什么有些通道只设计用于传输文本数据?在最基层,它们都是位。

5个回答

33

在底层,它们都是位(bit)...没错。但是,有些传输通道每个字节有七位,而其他传输通道每个字节有八位。如果您通过七位通道传输ASCII文本,则一切正常。二进制数据会被损坏。

此外,不同的系统使用不同的换行约定:LF和CRLF很常见,但某些系统使用CR或NEL。文本传输模式将自动转换换行符,这会损坏二进制文件。

然而,这些东西现在大多数只是历史性的兴趣。大多数传输通道都是8位(比如HTTP),并且大多数用户对获得的任何换行符都没有问题。

一些7位通道的例子:SMTP(名义上,没有扩展),SMS、Telnet、一些串行连接。互联网并不总是建立在TCP/IP之上,这一点可以看出。

此外,HTTP规范说明:

在规范形式下,“text”类型的媒体子类型使用CRLF作为文本换行符。HTTP放宽了这个要求,并允许以纯CR或LF代替换行符表示一行换行符,但必须在整个实体主体中始终如一。


小细节:从技术上讲,SMS有7位字符(紧缩)、8位二进制和16位字符模式。更有趣的是文本流中的字符集转换。我希望EBCDIC现在已经被Unicode取代了,但在旧时代(Y2K和GWoT之前),人们会感激自动在EBCDIC和“ASCII +某些奇怪的代码页(0x80-0xFF范围内)之间进行转换,其来源你可能记不清楚”。特别是在FTP“文本模式”下。通常情况下,它不起作用... - David Tonhofer
最终,“文本”是一种上下文相关的解释,而“二进制”则不是。当两个系统上的编辑器(或任何进程)尝试从二进制文件中读取“文本”时,它们对“文本”的约定必须一致,否则在传输二进制文件时或读写二进制文件时必须执行转换。与想象中的两个系统相比,一个系统通常使用PNG文件,另一个系统使用GIF文件。HTTP传输文本,但以ASCII头和“Content-Type”行的形式添加元数据,以提供精确的内容信息。 - David Tonhofer
@RestlessC0bra:那是不正确的,NEL 不等同于 LF。你说得对,NEL 不是 ASCII 的一部分。 - Dietrich Epp
像大多数字符一样,它是Unicode标准的一部分。它不仅出现在这个字符集中,而且不是ASCII的一部分。 - Dietrich Epp
那么在7位传输通道的情况下,Base64会出现并拯救我们吗? - BlueMice

13
所有文件都保存在两种文件格式之一 - 二进制或文本。这两种文件类型在表面上看起来可能相同,但它们的内部结构不同。
尽管二进制和文本文件都包含数据存储为一系列位(二进制值为1和0的位),但文本文件中的位表示字符,而二进制文件中的位表示自定义数据。

1
可能的来源(值得一读):http://fileinfo.com/help/binary_vs_text_files请仅返回翻译后的文本内容。 - Waldir Leoncio

6
区分这两者的区别非常重要,因为不同的操作系统对文本文件的处理方式不同。例如,在*nix中,您只需使用\n来结束行,而在MS操作系统中,您需要使用\r\n,而在Mac上,则需要使用\n\r。像FTP客户端这样的软件会尝试添加/删除字符来更改文本文件的行结尾以匹配目标操作系统。这是为了确保文本文件在目标操作系统上看起来正确。
例如,如果您在*nix中创建一个带有换行符的文本文件,并尝试将其作为二进制文件复制到Windows框中并在记事本中打开它,您将看不到任何行结尾,而只会看到一堆文本。

1
现在的 Mac 电脑使用 LF,过去使用 CR。我没有听说过任何系统使用 LFCR。 - Dietrich Epp

6
重要的是要补充已有答案中没有提到的内容,即文本文件和二进制文件都代表字节,但文本文件与二进制文件不同之处在于这些字节被理解为字符。将字节映射为字符时,使用特定的代码页或Unicode在整个文件上进行一致的映射。当使用7位或8位代码页时,您可以旋转指针以使用英文字母、德文字母、俄文字母或其他语言读取这些文件并解释它们。旋转指针不会影响字节,但会影响所选的字符与字节的对应关系。
正如其他人所述,还存在换行符编码的问题,这是文本文件独有的,并且可能因平台而异。"换行符"不是我们字母表中的一个字母,也不是您可以书写的符号,因此适用其他规则。
对于二进制文件,没有关于字符编码或"行"定义的隐含约定。

-2

所有的机器语言文件实际上都是二进制文件。

要打开一个二进制文件,必须在fopen命令中指定文件模式为"rb"或"wb"。否则,所有文件都将以默认模式打开,即文本模式。

需要注意的是,文本文件也可以存储和处理为二进制文件,但反之则不行。

二进制文件与文本文件有两个不同之处:

  1. 换行符的存储方式
  2. EOF字符

例如:

  • wt-t代表文本文件
  • Wb-b代表二进制文件

二进制文件不会在结尾处存储任何特殊字符,文件结束通过使用它们的大小来验证。


1
这是错误的。文本文件通常没有“EOF字符”(只需以二进制模式打开它们即可。在某些环境中,EOF可能由库生成)。 - David Tonhofer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接