1. Base64是什么
1.1 概念:
Base64是一种 “将二进制转为64个可打印字符” 的编码方式。
- Base64是网络上最常见的用于传输8Bit字节码的编码方式
- 一种基于64个可打印字符来表示二进制数据的方法
- Base64编码原理是从二进制到可打印字符的过程
- 采用Base64编码具有不可读性,需要解码后才能阅读
1.2 编码原理
标准的Base64协议使用了“A-Z、a-z、0-9、+、/” 64个可打印字符,然后把需要转换的二进制数据按照6bit位为一组(二进制数 000000 表示十进制的0,二进制数 111111 表示十进制的63),这样一组6bit位的二进制数就表示了 Base64 协议规定的字符的其中一个,进而把二进制数据转换成 Base64 协议字符组成的字符串。
注意:如果二进制数按6bit位分组时,出现位数不足的情况,则用 00 (两个0) 补齐,每增加 00 (两个0),就往 Base64 字符串加一个”=“。
1.2.1 标准Base64协议的字符
static const char b64_table[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }
1.2.2 将二进制数按6bit位
为一组分成若干组,每组表示一个索引,在Base64字符表找对应字符
字符文本 : 'A' 'B' 'C' ASSII码 : 65 66 67 二进制数 :01000001 01000010 01000011 分组之后 :010000 010100 001001 000011 Base64索引 : 16 20 9 3 Base64编码 : 'Q' 'U' 'J' 'D'
1.2.3 出现位数不足的情况,则用 00
(两个0) 补齐,每增加 00
(两个0),就往 Base64 字符串加一个“=”,下面以字符A
为例,A
的ASSII码为65
,二进制为01000001
,按6bit
分组后,加了4个0
,所以最后得到的Base编码加多两个'='
字符文本 : 'A' ASSII码 : 65 二进制数 :01000001 分组增加4个0 :010000 010000 Base64索引 : 16 16 Base64编码 : 'Q' 'Q' '=' '='
2.应用场景
任何需要将二进制数据转为可读字符的场景。
2.1 传输:需要将一组二进制数以字符串的方式去传输。
- 例如需要将一个1024字节的的指纹数据,按照json的形式传给服务器,因为json传输内容大多需要字符串,所以可以用Base64编码把这组二进制数据转为Base64编码数据进行传输。
2.2 保存:需要将数据转为字符串保存时。
3.Base64相关开源库
3.1 libb64
libb64是ANSI C例程的库,用于将数据快速编码/解码为base64编码格式。 包括C++封装程序,以及用于独立编码和解码可执行文件的源代码。
3.1.1 libb64使用
在Linux下解压
$ unzip libb64-1.2.1.zip
编译libb64.a
$ cd libb64-1.2.1/src/ $ make clean rm -f *.exe* *.o libb64.a *.bak *~ $ make cc -O3 -Werror -pedantic -I../include -c -o cencode.o cencode.c cc -O3 -Werror -pedantic -I../include -c -o cdecode.o cdecode.c ar rv libb64.a cencode.o cdecode.o ar: creating libb64.a a - cencode.o a - cdecode.o
参考资料: