C++ 使用Poco库进行base64编解码
flyfish
头文件
#include#include #include #include
编码
std::string to_base64 ( const std::string &source)
{
std::istringstream in(source);
std::ostringstream out;
Poco::Base64Encoder b64_e(out);
std::copy(std::istreambuf_iterator< char >(in),
std::istreambuf_iterator< char >(),
std::ostreambuf_iterator< char >(b64_e));
b64_e.close();
return out.str();
}
解码
std::string from_base64 ( const std::string &source)
{
std::istringstream in(source);
std::ostringstream out;
Poco::Base64Decoder b64_d(in);
std::copy(std::istreambuf_iterator< char >(b64_d),
std::istreambuf_iterator< char >(),
std::ostreambuf_iterator< char >(out));
return out.str();
}
调用
int main()
{
std::string source="a";
std::string target=to_base64(source);
std::cout << target << std::endl;//YQ==
std::string r=from_base64(target);
std::cout << r << std::endl;//a
}
不调用库的base64编码方式
std::string base64_encode(const unsigned char *data, int size)
{
//data 原始数据,size 原始数据的大小
//编码表
const char e_t[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //encode table
//返回值
std::string r;
unsigned char t[4] = {0};//temp
for (int i = 0; i < (int)(size / 3); i++)
{
t[1] = *data++;
t[2] = *data++;
t[3] = *data++;
r += e_t[t[1] >> 2];
r += e_t[((t[1] << 4) | (t[2] >> 4)) & 0x3F];
r += e_t[((t[2] << 2) | (t[3] >> 6)) & 0x3F];
r += e_t[t[3] & 0x3F];
}
//对剩余数据进行编码
int Mod = size % 3;
if (Mod == 1)
{
t[1] = *data++;
r += e_t[(t[1] & 0xFC) >> 2];
r += e_t[((t[1] & 0x03) << 4)];
r += "==";
}
else if (Mod == 2)
{
t[1] = *data++;
t[2] = *data++;
r += e_t[(t[1] & 0xFC) >> 2];
r += e_t[((t[1] & 0x03) << 4) | ((t[2] & 0xF0) >> 4)];
r += e_t[((t[2] & 0x0F) << 2)];
r += "=";
}
return r;
}



