C++ Base64编码
借助Base64可以将任意的二进制数据格式转换为可见字符的形式。每3个字节被转换为4个字符,转换之后的字符长度一定为4的倍数。
因此,如果只有两个字节,只能转换为3个字符,因此最后需要补一个字符'=';同理1个字节最后需要补两个'='。
class Base64Encode
{
public:
Base64Encode()
{
memcpy(_base_char, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 64);
}
bool encode_data(const char *src, int src_length, char *dest, int *dest_length)
{
do
{
int need_length = get_need_length(src_length);
*dest_length = need_length;
int index = 0;
while (index + 2 < src_length)
{
*dest++ = _base_char[(src[index] & 0xfc) >> 2];
*dest++ = _base_char[((src[index] & 0x3) << 4) | ((src[index + 1] & 0xf0) >> 4)];
*dest++ = _base_char[((src[index + 1] & 0xf) << 2) | ((src[index + 2] & 0xc0) >> 6)];
*dest++ = _base_char[src[index + 2] & 0x3f];
index += 3;
}
if (1 == src_length % 3)
{
*dest++ = _base_char[(src[index] & 0xfc) >> 2];
*dest++ = _base_char[(src[index] & 0x3) << 4];
*dest++ = '=';
*dest++ = '=';
}
else if (2 == src_length % 3)
{
*dest++ = _base_char[(src[index] & 0xfc) >> 2];
*dest++ = _base_char[((src[index] & 0x3) << 4) | ((src[index + 1] & 0xf0) >> 4)];
*dest++ = _base_char[(src[index + 1] & 0xf) << 2];
*dest++ = '=';
}
} while (false);
return false;
}
int get_need_length(int src_length)
{
int need_length = src_length / 3;
if (src_length % 3)
{
++need_length;
}
return (need_length << 2);
}
private:
char _base_char[64];
};