二进制数据和文本数据

244 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

二进制数据

在真实的计算机世界中,其实所有的数据全都是以二进制来存储,读取和传输的,这一点毋庸置疑。

我们存储的最小单元现在基本上就是只一个bit位,这个bit位只能是0或者1

这个0或者1在不同的媒介中物理形态不同,比如说在电缆中,高电平代表1, 低电平代表0

在磁盘中,由磁性有无代表1或者0

在光缆中,就变成了光信号的强弱。

总之,所有的地方都是以两种形态来代表一个最基本的bit位。

然后多个bit位就会形成大量的数据,一般把8个bit位成为一个字节。

也就是说,所有的地方都是以二进制bit位来作为基本单元的。

但是我们一般工作场景中,也还是会说诸如:

  • 这个文件是二进制的,比如说一个图片文件
  • 这种格式是二进制的,比如说doc文件
  • 这种协议是文本的,比如说HTTP协议(最新版本已经不是基于文本的了)

那这是什么意思?

难道还有什么文件或者说格式不是二进制的吗?

处理数据的程序

我们知道,不同的数据格式需要专用的程序来读取,否则就会造成打不开的现象。比如说:

  • 视频文件,要用视频播放器打开
  • 图片文件,要用图片相关的程序打开
  • 游戏的存档要用游戏本身才能读取

这是因为,不同的数据格式有其规律,程序必须事先知道这个数据格式的构成,才能进行相应的读取和处理。

字符和编码

在我另一篇文章中,谈过字符和编码的问题,有兴趣的可以先看看。

这里主要是来说明:字符的个数是有限的,也就是真正编码之后的二进制数据是有限的。

再进一步:不是所有的二进制数据都是一个字符的编码。

文本数据

接着上面的结论,在某种编码格式下,如果有一串二进制数据不是一个字符的编码,那么就称这一串数据是二进制的。

反过来,如果这一串二进制数据是字符编码,那么就称之为文本的,可打印的(严格的说,这里面还分成控制字符,比如说退格字符,回车换行等等)。

文本数据的特点

- 可以用命令行打印在终端,方便命令行各种操作,如果使用过Linux处理日志的话,这种好处就很明显
- 能直接用代码编辑器打开,方便人阅读和修改

这就是为什么有些格式或者协议在设计的时候,就要表明:我这是基于文本的。
由于文本格式非常方便,所以有很多情况下,我们都把二进制数据转换成文本数据。

举个例子,你要通过一个聊天程序,发送一段二进制数据给别人,但是聊天程序里面打字,这个输入限制只能让你输入文本数据。
那此时,你可以先将这个二进制数据转成文本的,通过聊天软件发给别人,对方收到之后再转换成原始二进制即可。
如果你搞过前端,那么Base64编码就是来干这个的。

如果你要在一个html文件里,硬插一个图片进去的话,那么就必须把图片base64之后,再放进去。为啥?因为html这个文件是文本的,是可以在代码编辑器打开的,不接受二进制。

文本数据的缺点

上面说了,不是所有的二进制数据都是文本的,如果我们规定一个系统里,所有的数据都只能是文本的,那只能出现一种情况,用某种转换方法,把二进制数据转换成文本的。

但是这种转换不仅耗时,而且一定会占用更多的空间。

比如说,一个图片base64之后,肯定变大了。不信你试试。

这就是为什么图片上传的时候,最好不要base64