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];
};

posted @ 2012-11-22 21:44  avexer  阅读(201)  评论(0编辑  收藏  举报