【发布时间】:2011-08-27 16:46:03
【问题描述】:
为什么在传输时要区分文本文件和二进制文件?为什么有些频道只为文本数据设计?在底层,它们都是比特。
【问题讨论】:
标签: text-files binaryfiles file-type
为什么在传输时要区分文本文件和二进制文件?为什么有些频道只为文本数据设计?在底层,它们都是比特。
【问题讨论】:
标签: text-files binaryfiles file-type
所有文件都以两种文件格式之一保存 - 二进制或文本。这两种文件类型在表面上可能看起来相同,但它们的内部结构不同。
虽然二进制文件和文本文件都包含存储为一系列(位(二进制值 1 和 0)的数据,但文本文件中的位表示字符,而二进制文件中的位表示自定义数据。
【讨论】:
所有机器语言文件实际上都是二进制文件。
为了打开一个二进制文件,文件模式必须在 fopen 命令中被称为“rb”或“wb”。否则所有文件都以默认模式打开,即文本模式。
请注意,文本文件也可以作为二进制文件存储和处理,但反之则不行。
二进制文件与文本文件有两种不同:
例如:
二进制文件末尾不存储任何特殊字符,文件末尾通过自身大小进行验证。
【讨论】:
补充已经提供的答案的重要一点是,文本文件和二进制文件都表示字节,但文本文件与二进制文件的不同之处在于字节被理解为表示字符。使用特定代码页或 Unicode 在文件上一致地完成字节到字符的映射。使用 7 位或 8 位代码页时,您可以在阅读这些文件时旋转拨号盘,并用英文字母、德文字母、俄文字母或其他字母来解释它们。这种旋转表盘不会影响字节,它会影响选择哪些字符来对应字节。
正如其他人所说,还有换行分隔符的编码问题,这是文本文件独有的,并且可能因平台而异。 “换行符”不是我们字母表中的字母或您可以书写的符号,因此其他规则适用于它。
对于二进制文件,没有关于字符编码或“行”定义的隐式约定。
【讨论】:
在底层,它们都是比特……是的。但是,有些传输通道每字节有 7 位,而其他传输通道有每字节 8 位。如果您通过七位通道传输 ASCII 文本,那么一切都很好。二进制数据被破坏。
此外,不同的系统对行尾使用不同的约定:LF 和 CRLF 很常见,但有些系统使用 CR 或 NEL。文本传输模式会自动转换行尾,这会损坏二进制文件。
然而,这些天来,这主要是出于历史的兴趣。大多数传输通道是 8 位的(例如 HTTP),大多数用户都可以接受他们得到的任何行结尾。
7 位通道的一些示例: SMTP(名义上,没有扩展)、SMS、Telnet、一些串行连接。互联网并不总是建立在 TCP/IP 之上,这表明了这一点。
此外,HTTP 规范指出,
当采用规范形式时,“文本”类型的媒体子类型使用 CRLF 作为文本换行符。 HTTP 放宽了这一要求,并允许传输带有纯 CR 或 LF 的文本媒体,当它对整个实体主体一致完成时,它只代表一个换行符。
【讨论】:
Content-Type 行的形式添加元数据。
区分两者很重要,因为不同的操作系统对文本文件的处理方式不同。例如,在 *nix 中你只用 \n 结束你的行,而在 MS 操作系统中你使用 \r\n 而在 Mac 中你使用 \n\r。诸如 FTP 客户端之类的软件尝试通过添加/删除字符来更改文本文件的行尾以匹配目标操作系统。这是为了确保文本文件在目标操作系统上看起来正确。
例如,如果您在 *nix 中创建一个带有换行符的文本文件,并尝试将其作为二进制文件复制到 Windows 框中并在记事本中打开,您将看不到任何行尾,而只是一个文字堵塞。
【讨论】: