【问题标题】:difference between text file and binary file文本文件和二进制文件的区别
【发布时间】:2011-08-27 16:46:03
【问题描述】:

为什么在传输时要区分文本文件和二进制文件?为什么有些频道只为文本数据设计?在底层,它们都是比特。

【问题讨论】:

    标签: text-files binaryfiles file-type


    【解决方案1】:

    所有文件都以两种文件格式之一保存 - 二进制或文本。这两种文件类型在表面上可能看起来相同,但它们的内部结构不同。

    虽然二进制文件和文本文件都包含存储为一系列(位(二进制值 1 和 0)的数据,但文本文件中的位表示字符,而二进制文件中的位表示自定义数据。

    【讨论】:

    【解决方案2】:

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

    为了打开一个二进制文件,文件模式必须在 fopen 命令中被称为“rb”或“wb”。否则所有文件都以默认模式打开,即文本模式。

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

    二进制文件与文本文件有两种不同:

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

    例如:

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

    二进制文件末尾不存储任何特殊字符,文件末尾通过自身大小进行验证。

    【讨论】:

    • 这是错误的。文本文件一般没有“EOF 字符”(只需以二进制模式打开即可。EOF 可能由某些环境下的库生成)
    【解决方案3】:

    补充已经提供的答案的重要一点是,文本文件和二进制文件都表示字节,但文本文件与二进制文件的不同之处在于字节被理解为表示字符。使用特定代码页或 Unicode 在文件上一致地完成字节到字符的映射。使用 7 位或 8 位代码页时,您可以在阅读这些文件时旋转拨号盘,并用英文字母、德文字母、俄文字母或其他字母来解释它们。这种旋转表盘不会影响字节,它会影响选择哪些字符来对应字节。

    正如其他人所说,还有换行分隔符的编码问题,这是文本文件独有的,并且可能因平台而异。 “换行符”不是我们字母表中的字母或您可以书写的符号,因此其他规则适用于它。

    对于二进制文件,没有关于字符编码或“行”定义的隐式约定。

    【讨论】:

      【解决方案4】:

      在底层,它们都是比特……是的。但是,有些传输通道每字节有 7 位,而其他传输通道有每字节 8 位。如果您通过七位通道传输 ASCII 文本,那么一切都很好。二进制数据被破坏。

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

      然而,这些天来,这主要是出于历史的兴趣。大多数传输通道是 8 位的(例如 HTTP),大多数用户都可以接受他们得到的任何行结尾。

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

      此外,HTTP 规范指出,

      当采用规范形式时,“文本”类型的媒体子类型使用 CRLF 作为文本换行符。 HTTP 放宽了这一要求,并允许传输带有纯 CR 或 LF 的文本媒体,当它对整个实体主体一致完成时,它只代表一个换行符。

      【讨论】:

      • 次要点:从技术上讲,SMS 有 7 位字符(打包)、8 位二进制和 16 位字符模式。更有趣的是文本流上的字符集转换。我希望EBCDIC现在几乎在所有地方都被Unicode取代了,但是在过去(在Y2K和GWoT之前,嗯!),人们会感激EBCDIC和“ASCII +一些奇怪的代码页在0x80-0xFF范围内的自动转换。其中你不记得了”。特别是在 FTP“文本模式”中。通常,它不起作用......
      • 最后,“文本”是依赖于上下文的解释,而“二进制”则不是。当两个系统上的编辑器(或任何进程)试图从二进制文件中读取“文本”时,他们关于“文本”是什么的约定必须一致,或者当二进制文件在系统之间传输时或二进制文件被读取或写入。与两个(想象的)系统进行比较,其中一个通常使用 PNG 文件,另一个使用 GIF。 HTTP 传输文本,但以 ASCII 标头和提供精确内容信息的 Content-Type 行的形式添加元数据。
      • @RestlessC0bra:这是不正确的,NEL 与 LF 不同。没错,NEL 不是 ASCII 的一部分。
      • 像大多数字符一样,它是 Unicode 标准的一部分。这不是它被发现的唯一字符集,它只是不是 ASCII 的一部分。
      【解决方案5】:

      区分两者很重要,因为不同的操作系统对文本文件的处理方式不同。例如,在 *nix 中你只用 \n 结束你的行,而在 MS 操作系统中你使用 \r\n 而在 Mac 中你使用 \n\r。诸如 FTP 客户端之类的软件尝试通过添加/删除字符来更改文本文件的行尾以匹配目标操作系统。这是为了确保文本文件在目标操作系统上看起来正确。

      例如,如果您在 *nix 中创建一个带有换行符的文本文件,并尝试将其作为二进制文件复制到 Windows 框中并在记事本中打开,您将看不到任何行尾,而只是一个文字堵塞。

      【讨论】:

      • Macs 现在使用 LF,他们曾经使用 CR。我没有听说过任何使用 LFCR 的系统。
      • 谢谢@Dietrich。不知道。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 2014-01-18
      • 1970-01-01
      • 2015-05-25
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多