文件在我看来分为文本文件和二进制文件
二进制文件和文本文件 在存储时 都是以二进制(0101...)存储的
二进制文件和文本文件 在解析时 的解析方法不同
1. 区分 是 二进制文件 还是文本文件
既然我们说了 二进制文件和文本文件 在存储时都是以二进制存储的,那么怎么区分呢?
一般来说,二进制文件 含有一些非标准输出的ASCII码
主要是前面的几十个控制字符,理论上只要含有 不包括cr/lf的控制字符 都可以认为是二进制文件
2. 用解析二进制文件的方法解析二进制文件,用解析文本文件的方法解析文本文件
解析二进制文件
所见即所得
存的是什么,就是什么,不用翻译
解析文本文件
用 ascii翻译表 做 "二进制码Oct->字符Char"的翻译,输出Char .有了ascii翻译表表,文本文件用来存储英文。
用utf8翻译表,文本文件可以用来存储全世界各地的文字
A.实例
文本文件 : txt,.c ,.cpp,.java,.bat
二进制文件 : 分为数据文件和代码文件
数据文件按照一定格式排布,被代码解释
数据二进制文件的格式在不同领域也会被标准化,例如音视频领域的mp3,mkv等格式
代码文件也是按照一定格式排布,被linker&loader解释
代码二进制文件格式在不同的os下有不同的设计历史
另外代码二进制文件从其他角度可分为1.可执行文件,2..o文件,3.so文件,4.a文件
B.读写二进制文件的区别
在linux下面,"以二进制方式 fopen 打一个文件并读写"和"以文本方式 fopen 打一个文件并读写"是一样的
读出来一个字节并显示, printf 展示该字节,可以用 "%c"(翻译成字符) 和"%x"(不翻译直接打印)
在win 下面,"以二进制方式 fopen 打一个文件并读写"和"以文本方式 fopen 打一个文件并读写"是不一样的
C.二进制文件和文本文件的不同
能存储的数据类型不同
文本文件的一个字节只能(不是技术上不能存,只是存了就不是文本文件了)存储的值的集合为(0x00-0xFF 中的一部分)
二进制文件一个字节可以存储的值的集合为(0x00-0xFF 中的所有值)
操作系统对换行符('\n')的处理不同
文本文件,操作系统会对’\n’进行一些隐式变换,因此文本文件直接跨平台使用会出问题。
在Windows下,
写入’\n’时,操作系统会隐式的将’\n’转换为”\r\n”,再写入到文件中;读的时候,会把“\r\n”隐式转化为’\n’,再读到变量中。
在Linux下,
写入’\n’时,操作系统不做隐式变换。
二进制文件,操作系统不会对’\n’进行隐式变换,很多二进制文件(如电影、图片等)可以跨平台使用。
每条数据的长度
文本文件每条数据通常是固定长度的。
以ASCII为例,每条数据(每个字符)都是1个字节.
utf-8 还不固定呢...
二进制文件每条数据不固定
short占两个字节
int占四个字节
float占8个字节
读取的软件不同
文本文件编辑器就可以读写。
比如记事本、NotePad++、Vim等。
二进制文件需要特别的解码器
数据二进制文件
bmp文件需要图像查看器
rmvb需要播放器
vim (:%!xxd) , xxd
二进制的生成工具&二进制的解析工具
对于MP3和mp4来讲,recorder&player
代码二进制文件
二进制的生成工具&二进制的解析工具
linker & loader
vim (:%!xxd)
xxd
D.如何区分一个文件是文本文件还是二进制文件
解读 file 命令
printf "0: %.4x" 0xff00
0: ff00
----
printf "0: %.4x" 0xff00 | xxd -r -g0 > obj.bin
====
xxd obj.bin > obj.text
---
cat obj.text
00000000: ff00 ..
$ bootloader2.txt
00000000: 00c0 5800 03e1 aa1f 03e2 aa1f 03e3 aa1f
00000010: 0084 5800 0080 d61f 0000 4800 0000 0000
00000020: 0000 4040 0000 0000 0000 0000 0000 0000
xxd -r bootloader2.txt bootloader.bin