OpenSSL进行base64编解码(C++开发)

  • Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
  • Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
  • Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
  • 标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。 为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
  • Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

Base64编码

int Base64Encode(const unsigned char *in, int len, char *out_base64)
{
    if (!in || len <= 0 || !out_base64)
        return 0;
    // 源 内存BIO
    auto mem_bio = BIO_new(BIO_s_mem());
    if (!mem_bio)return 0;

    //过滤 base64 BIO
    auto b64_bio = BIO_new(BIO_f_base64());
    if (!b64_bio)return 0;

    //形成BIO链 b64-mem
    BIO_push(b64_bio, mem_bio);

    //往链头写入 base64处理后传到链尾
    BIO_write(b64_bio, in, len);

    //刷新缓冲,写入到链表的下一个BIO
    BIO_flush(b64_bio);

    BUF_MEM *p_data;

    //获取内存BIO中数据 
    BIO_get_mem_ptr(b64_bio, &p_data);

    memcpy(out_base64, p_data->data, p_data->length - 1);
    out_base64[p_data->length - 1] = 0;
    BIO_free_all(b64_bio);
    return p_data->length;
}

Base64解码

int Base64Decode(const char *in, int len, unsigned char *out_data)
{
    if (!in || len <= 0 || !out_data)
        return 0;
    // 源 内存BIO
    auto mem_bio = BIO_new_mem_buf(in, len);
    if (!mem_bio)return 0;

    //过滤 base64 BIO
    auto b64_bio = BIO_new(BIO_f_base64());
    if (!b64_bio)return 0;
    //形成BIO链 b64-mem
    BIO_push(b64_bio, mem_bio);

    BIO_read(mem_bio, out_data, len);

    BIO_free_all(mem_bio);

    return true;
}
关闭