文本文件和二进制文件的区别


文件在我看来分为文本文件和二进制文件

二进制文件和文本文件	在存储时	都是以二进制(0101...)存储的
二进制文件和文本文件	在解析时 的解析方法不同

1. 区分 是 二进制文件 还是文本文件
	既然我们说了 二进制文件和文本文件 在存储时都是以二进制存储的,那么怎么区分呢?
	一般来说,二进制文件 含有一些非标准输出的ASCII码 // 0x01就是非标准输出的ASCII码,0x61就是标准输出的ASCII码
	主要是前面的几十个控制字符,理论上只要含有 不包括cr/lf的控制字符 都可以认为是二进制文件
2. 用解析二进制文件的方法解析二进制文件,用解析文本文件的方法解析文本文件
	解析二进制文件
		所见即所得
		存的是什么,就是什么,不用翻译
	解析文本文件
		用 ascii翻译表 做 "二进制码Oct->字符Char"的翻译,输出Char .有了ascii翻译表表,文本文件用来存储英文。// man 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 中的一部分) // ascii 表中有翻译的部分
		二进制文件一个字节可以存储的值的集合为(0x00-0xFF 中的所有值) // 包括 ascii 表中有翻译的部分
		
	操作系统对换行符('\n')的处理不同
		// linux对二进制和文本的处理是相同的,按道理,win 可以做成相同的,但是win就是没做成相同的
		文本文件,操作系统会对’\n’进行一些隐式变换,因此文本文件直接跨平台使用会出问题。 
		在Windows下,
			写入’\n’时,操作系统会隐式的将’\n’转换为”\r\n”,再写入到文件中;读的时候,会把“\r\n”隐式转化为’\n’,再读到变量中。 
		在Linux下,
			写入’\n’时,操作系统不做隐式变换。 
			二进制文件,操作系统不会对’\n’进行隐式变换,很多二进制文件(如电影、图片等)可以跨平台使用。
	
	每条数据的长度 // 其实这是解析部分的不同,在存储上没有长度的概念,都是一个bit一个bit存储的
		文本文件每条数据通常是固定长度的。 // 其实也不是相同的,不同编码方式是不同的
			以ASCII为例,每条数据(每个字符)都是1个字节.
			utf-8 还不固定呢...
		二进制文件每条数据不固定
			short占两个字节
			int占四个字节
			float8个字节
	
	读取的软件不同  // 其实这种分类在存储上也没有意义,如果我写一个能打开所有文件并能正常展示的APP
		文本文件编辑器就可以读写。
			比如记事本、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 // 格式要求, 从0开始
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值