Base64编码原理及介绍

        Base64是一种基于64个可打印字符来表示二进制数据的编码方式,是从二进制数据到字符的过程。 原则上,计算机中所有内容都是二进制形式存储的,所以所有内容(包括文本、影音、图片等)都可以用base64来表示。

        BASE64使用的场合是在保证传输渠道和格式协议不改变的情况下,解决了部分控制符及二进制数据无法编码显示问题。如ASCII协议只编码0-127的数据,但是其他的值是无法传输的。在文本显示中会出现乱码的情况,即无法让所有的字节信息传输给接收方。
        为了解决这个问题,使用BASE64对要传输的二进制数据(不一定是文本,可能是一段十六进制数据)进行变换再BASE64编码,将编码结果(即可显示字符)通过传输协议如ASCII传输给接收者。接收者看到的是BASE64编码出的结果。

一、Base64编码规则

    Base64本质上是对原始二进制数据的再编码过程,从bit流角度来讲,把8bit数据流按6bit进行再编码,6个bit使用可打印字符表示,再使用ASCII码传输这些打印字符。接收端反向操作,将6bit还原成8bit的二进制数据。我这里叫它0x86变换,便于记忆。

二、Base64编码过程及特点 

 2.1 BASE64的编码过程        

         如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个'='号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。

2.2 BASE64的编码特点

        从BASE64的编码过程可以看出,86转换的公约数是24,也就是原数据必须是3字节,编码后的数据是4字节,编码后的文本一定是4的倍数。

        那么问题来了,如果原始数据不是3的倍数怎么办呢?

        两种操作:(1)补字节,分为补一个字节,补二个字节。(2)不补字节,默认添加0bit。

        对应的编码后的字符如何显示才能让接收端知道原始数据被了几个字节或者几个bit呢?

        答案也有两种:

         a.通过“=”号来判断,一个等号代表原始数据补充了一个字节,二个等号代表原始数据补充了二个字节。

         b.base64编码没有等号,最后几个字节不是4的倍数,在解码过程中自动去掉补充了0bit位。

        总结:无论编码后的字符是不是4的倍数,解码器都可以识别原始数据是否是否补充了,从而解析出原始二进制数据。

三、Base64编码工具及例子

        在线的base64工具大部分不适用于二进制文件的编码,如某一网站的编码如下:

源码:2F7

BASE64编码:MkY3

其编码过程为:

1.对2F7进行ASCII编码,得到0x32 0x46 0x37

2.对ASCII的16进制进行BASE64编码得到MkY3

但是在应用中这样做的问题是工具只能对可显示的ASCII码进行编码,局限性很大,我们希望对二进制流进行编码,所以对原始数据我们认为其就是二进制数据,而不是ASCII显示码。

例:16进制码0x2F7其二进制为0b001011110111

Base64编码为0b001011   110101   110000=0x0B 0x35 0x30 =L1w(这才是正确的编码值)

另一个例子(16字节的KEY传输):

如右图是一个16字节的KEY,0xAF584EEC2DC06799AF4E9DB1659E9C20,这个值可以用于软件的算法计算。

它的base64编码就是:r1hO7C3AZ5mvTp2xZZ6cIA==

四、Base64编码表

  以下是Base64的十进制,十六进制及字符编码表:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值