Base64编码说明
先简单的说明一下Base64的编码算法。Base64编码要求将3个8位字节(3*8=24)的数据转化为4个6位字节(4*6=24)的数据,之后在6位的前面填补两个0。
当然需要编码的数据也有可能不足3的倍数。那么余下不足3个字节的部分编码时,仍然是编码成4个字节。不足的部分则会使用到’=’来进行填补。
编码出来的数据对应的十进制值范围是0-63。Base64定义了一个表,将这些值和字符做了一一对应。表格如下:
Base64编码举例
以”A”编码举例,’A’的ASCII为65,二进制为01000001:
首先从高位到低位取6位字节010000,并填补0为00010000。十进制即16,查表对应的字符是’Q’。
取剩余两位,其余填补0为00010000。十进制也是16,查表对应的字符是’Q’。
剩余两位没有数据可取。则置为’=’。
最终”A”使用Base64编码出来的结果是”QQ==”
C语言的实现
知道了原理,实现起来就比较容易了。对于解码刚好是编码的逆过程。这里就不再赘述了。代码如下:
/* base64.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define safe_free(it) if(it) {free(it); it = NULL;}
static char b64_to_ascii(char str)
{
if (str >= 0 && str <= 25) {
return str + 65;
} else if (str >= 26 && str <= 51) {
return str + 71;
} else if (str >= 52 && str <= 61) {
return str - 4;
} else if (str == 62) {
return '+';
} else {
return '/';
}
}
static char ascii_to_b64(char str)
{
if (str >= 65 && str <= 90) {
return str - 65;
} else if (str >= 97 && str <= 122) {
return str - 71;
} else if (str >=