1、base64算法概念
1) 简述
该算法被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式,达到一眼望去完全看不出内容。此算法的复杂程度要小,效率高。如果是基于以上两点,那么我们使用最简单的单字母代替法等即可,实际上base64要稍微复杂些,这是因为在email的传送过程中,由于历史原因,email只被允许传送ascii字符,即一个8位字节的低7位。
2) 具体描述
把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在每个6位的前面补两个0,形成8位,即一个字节。再根据每个字节的值,用下表中的值替换,不足4个字节的,补“=”。例如,高山(0xb8dfc9bd),先将(0xb8dfc9)分割成四个字节(0x2e0d3f09),用下表值替换为(un/j);再将(0xbd)分割成(0x2f10)用下表值替换为(vq),再补两个(=),合起来就形成了编码后的课件字符串(un/j vq==)。
2、base64的实现原理
1)将给定的字符串转换成对应的字符编码(如:gbk、utf-8)
2)将获得该字符编码转换成二进制码
3)对获得的二进制码进行分组操作
第一步:每3个字节(8位二进制)为一组,一共24个二进制位
第二步:将这个24个二进制位分成4组,每个组有6个二进制位,不足6位的,后面补0。
第三步:在每个组前面加两个0,这样每个组就又变成了8位,即每个组一个字节,4个组就4个字节了。
第四步:根据base64的转码表找到每个字节对应的符号,这个符号就是base64的编码值
3、base64算法的实现
1) 编码函数
char gencbase64(unsigned char* indata, unsigned long inlen,\
unsigned char *outdata, unsigned long *outlen);//编码
功能:对长度为inlen的输入数据indata进行base64编码,编码后的数据存放在提前开辟好的内存outdata中去,其长度outlen不得小于((inlen+2)/3)*4。
参数:
indata:要进行编码的数据的地址指针。
inlen:要进行编码的数据的长度。
outdata:编码后数据存放的地址指针。
outlen:传入outdata的长度,传出编码后的数据的长度。
返回值:成功时,返回编码后的数据的地址,失败时,返回null。
2) 解码函数
char gdecbase64(unsigned char* indata, unsigned long inlen,\
unsigned char *outdata, unsigned long *outlen);//解码
功能:对长度为inlen的输入数据indata进行base64解码,解码后的数据存放在提前开辟好的内存outdata中去,其长度outlen不得小于inlen*3/4。
参数:
indata:要进行解码的数据的地址指针。
inlen:要进行解码的数据的长度。
outdata:解码后数据存放的地址指针。
outlen:传入outdata的长度,传出解码后的数据的长度。
返回值:成功时,返回解码后的数据的地址,失败时,返回null。
4、base64编码表
value指二进制对应的十进制编码,encoding指base64的编码值
base64编码规则:
经过base64编码后的字符串的字符数一定是4的整数倍。在使用base64编码时,如果得到的字符数不为4的整数倍,则后面使用等号 ‘=’补足
举例说明:
(1) 举一个具体的实例,演示英语单词man如何转成base64编码。
第一步,“m”、“a”、“n”的ascii值分别是77、97、110,对应的二进制值是01001101、01100001、01101110,将它们连成一个24位的二进制字符串010011010110000101101110。
第二步,将这个24位的二进制字符串分成4组,每组6个二进制位:010011、010110、000101、101110。
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节:00010011、00010110、00000101、00101110。它们的十进制值分别是19、22、5、46。
第四步,根据上表,得到每个值对应base64编码,即t、w、f、u。
因此,man的base64编码就是twfu。
如果字节数不足三,则这样处理:
a)二个字节的情况:将这二个字节的一共16个二进制位,按照上面的规则,转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的base64编码,再在末尾补上一个“=”号。
比如,“ma”这个字符串是两个字节,可以转化成三组00010011、00010110、00010000以后,对应base64值分别为t、w、e,再补上一个“=”号,因此“ma”的base64编码就是twe=。
b)一个字节的情况:将这一个字节的8个二进制位,按照上面的规则转成二组,最后一组除了前面加二个0以外,后面再加4个0。这样得到一个二位的base64编码,再在末尾补上两个“=”号。
比如,“m”这个字母是一个字节,可以转化为二组00010011、00010000,对应的base64值分别为t、q,再补上二个“=”号,因此“m”的base64编码就是tq==。
(2) 再举一个中文的例子,汉字“严”如何转化成base64编码?
这里需要注意,汉字本身可以有多种编码,比如gb2312、utf-8、gbk等等,每一种编码的base64对应值都不一样。下面的例子以utf-8为例。
首先,“严”的utf-8编码为e4b8a5,写成二进制就是三字节的“11100100 10111000 10100101”。将这个24位的二进制字符串,按照第3节中的规则,转换成四组 一共32位的二进制值“00111001 00001011 00100010 00100101”,相应的十进制数为57、11、34、37,它们对应的base64值就为5、l、i、l。
所以,汉字“严”(utf-8编码)的base64值就是5lil。
AITO首款纯电SUV上市 问界m5ev驾乘舒适性遥遥领先
浅析薄膜电容器的自愈特性
苹果2019年第一季度盈利将低于预期并减少90亿美元的盈利
英特尔MovidiusMyriadX芯片与德州仪器(TI)TDA4VM芯片的区别
ADI拟170亿美元收购Maxim
Base64算法原理简介(算法实现及例子)
中兴通讯首席科学家向际鹰:5G呼唤革命性创新
比亚迪发布了2019年3月销量快报,3月储能电池及新能源汽车动力电池装机总量约为1.646GWh
雷达目标模拟器的DSP软件设计
警用AI已经开始向现实逼近,对于警用AI来说最大的问题是歧视问题和隐私问题
苹果跨界有望重塑全球新能源格局?
忆联SSD智慧算法关注用户痛点,为消费级SSD带来极致性能与功耗体验
LTC1968-精准宽带宽、RMS至DC转换器
大唐-安捷伦TD-LTE-Advanced联合研究实验室成立
太阳能光伏组件的详细介绍
现场总线型交通倒计时器的设计
一加5和小米mix2哪个好?全面屏和双摄的选择
AR和MR共享体验是未来AR/MR的发展方向吗
为什么LDPC码不适合工业存储
realme X大师白蒜配色版正式发布搭载了骁龙710处理器屏占比高达91.2%