Base 64 Encoding有什么用?举个简单的例子,你使用SMTP协议 (Simple Mail Transfer Protocol 简单邮件传输协议)来发送邮件。因为这个协议是基于文本的协议,所以如果邮件中包含一幅图片,我们知道图片的存储格式是二进制数据(binary data),而非文本格式,我们必须将二进制的数据编码成文本格式,这时候Base 64 Encoding就派上用场了。
一、编码原理
二、相关代码
/*
用于将二进制数据进行Base64编码。它接受一个输入字节数组(in)和输入长度(inLen),
并将编码后的结果存储到输出字符串(out)中。
可参考:https://kb.cnblogs.com/page/166471/
*/
extern int base64_encode(const unsigned char *in, int inLen, char *out)
{
//编码表,用于将输入数据进行编码
static const char *ENC = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char *original_out = out; //保存了输出字符串的起始地址,用于计算编码后的字符串长度
while (inLen) {
// first 6 bits of char 1
*out++ = ENC[*in >> 2]; //将输入字节的前6位进行编码,并将编码后的字符存储到输出字符串中
if (!--inLen) { //检查是否只剩下一个输入字节
// last 2 bits of char 1, 4 bits of 0
//输入字节的后2位和下一个输入字节的前4位进行编码,并将编码后的字符存储到输出字符串中。
*out++ = ENC[(*in & 0x3) << 4];
*out++ = '=';
*out++ = '=';
break;
}
// last 2 bits of char 1, first 4 bits of char 2
//将输入字节的后4位和下一个输入字节的前2位进行编码,并将编码后的字符存储到输出字符串中。
*out++ = ENC[((*in & 0x3) << 4) | (*(in + 1) >> 4)];
in++;
if (!--inLen) {
// last 4 bits of char 2, 2 bits of 0
//将输入字节的后4位和下一个输入字节的前2位进行编码,并将编码后的字符存储到输出字符串中
*out++ = ENC[(*in & 0xF) << 2];
*out++ = '=';
break;
}
// last 4 bits of char 2, first 2 bits of char 3
*out++ = ENC[((*in & 0xF) << 2) | (*(in + 1) >> 6)];
in++;
// last 6 bits of char 3
//将输入字节的后6位进行编码,并将编码后的字符存储到输出字符串中
*out++ = ENC[*in & 0x3F];
in++, inLen--;
}
return (out - original_out);
}