文本文件和二进制文件的区别
Posted
技术标签:
【中文标题】文本文件和二进制文件的区别【英文标题】:difference between text file and binary file 【发布时间】:2011-08-27 16:46:03 【问题描述】:为什么在传输时要区分文本文件和二进制文件?为什么有些频道只为文本数据设计?在底层,它们都是比特。
【问题讨论】:
【参考方案1】:所有文件都以两种文件格式之一保存 - 二进制或文本。这两种文件类型在表面上可能看起来相同,但它们的内部结构不同。
虽然二进制文件和文本文件都包含存储为一系列(位(二进制值 1 和 0)的数据,但文本文件中的位表示字符,而二进制文件中的位表示自定义数据。
【讨论】:
可能的来源(值得一读):fileinfo.com/help/binary_vs_text_files【参考方案2】:所有机器语言文件实际上都是二进制文件。
为了打开一个二进制文件,文件模式必须在 fopen 命令中被称为“rb”或“wb”。否则所有文件都以默认模式打开,即文本模式。
请注意,文本文件也可以作为二进制文件存储和处理,但反之则不行。
二进制文件与文本文件有两种不同:
-
换行符的存储
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。不知道。以上是关于文本文件和二进制文件的区别的主要内容,如果未能解决你的问题,请参考以下文章