为什么要使用base64?

691 阅读3分钟

有一天,前端同事给我传图片(非url),然后让我把图片分享到微信,当然还有其他参数一并传给我,方式通过url的参数方式,这就是遇到的场景. 这种情况就需要将图片转化为base64. 还有一种场景,比方我想在网络请求的json中直接拿到图片本身,而不是图片的Url,这时也需要将图片的文件转化为Base64的形式.

先说两个概念,文本协议和二进制协议

文本协议:最大的特点是他需要通过一些符号来定义格式,比方说json,Http协议,这些需要特定符号对里面的内容进行分割,例如HTTP协议是基于行的协议,每一行以\r\n作为分隔符,你如果不换行,那我们就搞不清楚你表达的什么意思了,就想你和别人交流打了很多字,没有标点符号一样,没办法断句,很可能就搞不清楚你是什么意思了.

二进制协议:他就不需要特定的符号来定义格式,他一般是大家先定义好某些字节代表什么,比方说我前八个 字节 表示 名字, 中间 八个字节表示 在哪 ,最后八个字节表示在干什么, 这个二进制协议定好之后,你必须按照这个要求来,而不能说我前八个字节表示在干吗?那就会解析出错了.

既然是文本协议,肯定是通过能打印的字符来表示,分割用特殊的,这样下来就是好区分,好分割.用特殊符号去分割这些内容信息. 再说前面遇到的场景,图片二进制里面很可能含有被文本协议分割的特殊字符(比如ASCII的0~32编码的字符在某些传输介质中,是会被当作特殊含义处理的),这样被错误的分割或者断掉之后你就没办法找到这个图片了,讲到你可能就明白了把这些特殊符号换成可打印的字符不就行了吗?这个过程其实就是Base64.

再说说我们平时的做法,比方说前端上传图片,一般直接上传图片的二进制数据,如果想把返回的Json 数据中放一个图片的二进制就不行的,如果想通过json放一个图片的数据(不是图片的URL).你就要考虑 将图片的二进制转化为Base64 进行处理了。也就是如果传输协议是纯文本的,你要想传输数据的话,那你要么传图片的url,要么传图片的Base64.但是Base64 你不能搞太长了,要不又有性能问题了,因为base64 要比原来的更长,所以没有人用base 64 来传视频和音频资源,只用来传一些小的图片资源。

http 虽然是纯文本的协议,但是http有针对二进制数据做特殊的规定(mime),所以用http直接传输二进制,所以需要就是例子说的那样了。

文本协议和二进制协议,这些和网络传输都是0101这个二进制有没有关系? 这个和网络分层的思路一样,这是应用层的东西,和下面数据链路层没啥关系。网络进行分层的最大好处是更换下面一层,不会影响到上面的一层。