二进制文件、文本文件

先说结论:

二进制文件和文本文件都是按照二进制存储的,只不过文本文件是把一个字节一个字节解读成字符,而二进制文件可以任意定义解读方式。


在windows上,用记事本就可以打开文本文件了,但要打开二进制文件需要对应的二进制文件解码器,因此,文本文件是更为大家所熟知的文件形式,而二进制文件的优点在于它的输入输出都省去了转换的过程,而且更省空间。

文件的读写过程:

磁盘— 文件缓冲区 — 应用程序的内存空间

我们说的,“文本文件和二进制文件没有区别”,实际上针对的是第一个过程,那么打开方式不同,为何显示内容就不同呢?这个区别实际上是第二个过程造成的。

我们说文本文件是特殊的二进制文件,是因为文本文件实际上的解释格式已经确定了:ASCII或者Unicode编码。这些都是针对文本的编码格式。二进制文件则可以有各种存储结构。

举个实例:

file = open('test.txt', 'wb')  # 创建test.txt文件
file.write(b'\x41\x42')  # 直接向其写入十六进制数据0x41和0x42(字符串AB)
file.close()  # 关闭文件(相当于保存)
# 此时用任意文本编辑器打开test.txt,你可以看到字符串AB出现在屏幕上

字符A和B在ASCII编码格式中对应的十六进制数字分别是0x41和0x42(二进制分别为1000001和1000010)。我可以直接创建一个文件,直接向里面写入十六进制数据0x41和0x42(注意是直接写入数据,不是一般的文本输入),保存之后使用一般的文本编辑器打开,我就能看到字符串AB显示在屏幕上了。


文本文件是字符编码的文件,二进制文件是对值编码的文件。

计算机在物理内存上面存放的都是二进制,所以文本文件和二进制文件的主要区别是在逻辑上的而不是物理上的。而从文件的编码方式来看,文件可以分为文本文件和二进制文件。文本文件是基于字符编码的文件,常见的有ASCII、Unicode等,二进制文件是基于值编码的文件,可以看成是变长编码,你可以根据自己的需要,决定多少个比特代表一个值。

二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。

文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式。

如果是需要频繁的保存和访问数据,那么应该采取二进制文件进行存放,这样可以节省存储空间和转换时间。

如果需要频繁的向终端显示数据或从终端读入数据,那么应该采用文本文件进行存放,这样可以节省转换时间。

这里写图片描述

文本文件的打开方式和二进制文件打开方式的区别:

(1)文本模式中回车被当成一个字符’\n’,在文件中如果读到0x1B,文本模式会认为这是文件结束符,会按照一定方式对数据做相应的转换。

(2)二进制模式中’\n’会被认为是两个字符0x0D,0x0A;在读到0x1B时,二进制模式不会对文件进行处理。

参考文章:https://blog.csdn.net/double_happiness/article/details/71123809


二进制文件是包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。

文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件。它是以 “行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。

文本工具打开一个文件的过程是怎样的呢?拿记事本来说,它首先读取文件物理上所对应的二进制比特流,然后按照你所选择的解码方式来解释这个流,然后将解释结果显示出来。一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。例如对于这么一个文件流”01000000_01000001_01000010_01000011”(下划线”_”,为了增强可读性手动添加的),第一个8比特”01000000”按ASCII码来解码的话,所对应的字符是字符”A”,同理其它3个8比特可分别解码为”BCD”,即这个文件流可解释成“ABCD”,然后记事本就将这个“ABCD”显示在屏幕上。

用记事本打开二进制文件与上面的情况类似。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应嘛。例如文件流”00000000_00000000_00000000_00000001”可能在二进制文件中对应的是一个四字节的整数int 1,在记事本里解释就变成了”NULL_NULL_NULL_SOH”这四个控制符。

参考文章:
https://blog.csdn.net/qq_27736025/article/details/50725598
https://www.cnblogs.com/pengwangguoyh/articles/3223072.html

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/81586278