Base64是一种用于将二进制数据转换为ASCII字符串的编码方法。它得名于它使用64个不同的字符来表示所有可能的6位二进制组合。Base64编码的主要目的是将二进制数据转换为文本数据,以便在文本协议中进行安全传输,例如电子邮件或XML文档。
那么Base64到底是怎样编码的呢?在Base64编码中,每三个字节的二进制数据(24位)被分割为四个6位的组,然后映射到相应的Base64字符。这通常涉及到填充(padding),以确保编码后的字符串长度是4的倍数。
简单来说,任何一个数据无非可以看作一个比特流,如01000100010011101100111010111100011001010......那么我们取6个比特为一组,计算它的ascii值,得到一个字符,这个字符肯定是可见字符,好,把它对应的字符写出来,再取6个比特,计算...,如此下去,直到最后,就完成了编码。
为什么要作一下这样的编码呢?我们知道在计算机中的字节共有256个组合,对应就是ascii码,而ascii码的128~255之间的值是不可见字符。
ASCII (American Standard Code for Information Interchange) 是一种字符编码标准,最初设计用于英语,它定义了从0到127的字符,包括标准的英文字母、数字、标点符号等。这些字符被称为ASCII的基本字符集。
ASCII码中的128到255之间的值被称为扩展ASCII码或ASCII扩展字符集。这个扩展部分包含了一些特殊字符、符号、以及用于不同语言和特殊应用的字符。然而,这个范围内的字符在不同的系统和应用中可能表现为不同的符号或图形,因为扩展ASCII没有统一的标准。
在ASCII码的128到255之间的值中,有一部分是被定义为控制字符(Control Characters),这些字符并没有具体的可视化图形,而是用于控制设备和通信协议。这些控制字符包括一些在计算机显示器上不可见的控制功能,如换行、回车、制表符等。这也是为什么这个范围内的值被称为不可见字符的原因。
总的来说,ASCII码中128到255之间的值包含了一些控制字符和特殊符号,这些字符可能在文本显示中没有具体的可视化表示,而是用于在计算机和通信领域执行特定的控制和操作。
而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。 对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
主要的优势和用途包括:
文本传输: 在文本协议中,只有可打印的ASCII字符是安全的,而Base64编码可以将二进制数据转换为这些字符,以便在文本协议中进行传输,而不损失数据。
数据传输: 在处理二进制数据(如图片、音频、视频等)时,Base64编码可用于在文本环境中进行传输,比如在HTML、CSS、JavaScript中嵌入图片数据。
加密签名: 在某些情况下,Base64也用于简单的加密需求,但请注意,它并不是真正的加密算法,只是一种编码方式。
URL编码: 在URL中传递参数时,有时候需要将数据进行Base64编码以确保数据的安全传输,因为一些字符可能会在URL中引起问题。
提供几个工作中用到过的base64场景:
1)比方说前端上传图片,图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。如果页面上有太多的图片则会多次请求服务器,如果直接文本存入html可以减少请求次数。一般直接上传图片的二进制数据,如果想把返回的Json 数据中放一个图片的二进制就不行的,如果想通过json放一个图片的数据(不是图片的URL).你就要考虑 将图片的二进制转化为Base64 进行处理了。也就是如果传输协议是纯文本的,你要想传输数据的话,那你要么传图片的url,要么传图片的Base64.但是Base64 你不能搞太长了,要不又有性能问题了,因为base64 要比原来的更长,所以没有人用base 64 来传视频和音频资源,只用来传一些小的图片资源。
2)一个xml当中包含另一个xml数据,此时如果将xml数据直接写入显然不合适,将xml进行适当编码存入较为方便,事实上xml当中的字符一般都是可见字符(0-127之间),但是由于中文的存在,可能存在不可见字符,直接将字符打印在外层xml的数据中显然不合理,那么怎么办呢?可以使用base64进行编码,然后存入xml,解码反之其实还有个办法,将byte的值写在xml当中,空格或者,分开,这样也可以将byte数据传入,不过这样更浪费空间,并且不易保存.
3)另一个,比如http协议当中的key value字段,必须进行URLEncode 不然出现的等号可能使解析失败 空格也会使http请求解析出现问题,比如 请求行就是以空格来划分的 POST /guowuxin/hehe HTTP/1.1
4)电子邮件刚问世的时候只能传输英文,但后来随着用户的增加,中文、日文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理。
需要注意的是,Base64并不是加密,只是编码,它不会改变数据的内容,只是改变了表示方式。在某些情况下,Base64编码后的数据可能比原始数据稍微增加了一些长度。
我想等网站访问量多了,在这个位置放个广告。网站纯公益,但是用爱发电服务器也要钱啊 ----------狂奔的小蜗牛