base64 - 编码解码

基于:openssl-1.0.1g

int openssl_base64_encode(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len)
{
    int ret = 0;

    BIO * bmem = NULL;
    BIO * b64 = NULL;
    BUF_MEM * bptr = NULL;

    if ((NULL == in) || (NULL == out) || (NULL == out_len) || (0 == in_len))
    {
        printf("%s-%d:input paraments error!\n", __FUNCTION__, __LINE__);
        return -1;
    }

    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    
    // if no set, each 64 bytes will add '\n', the end of string will add '\n' too. this will result base64 cannot decode.
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);

    BIO_write(b64, in, in_len);
    ret = BIO_flush(b64);
    if (0 != ret)
    {
        /*remove Warming Error*/
    }

    BIO_get_mem_ptr(b64, &bptr);

    /*
    if (bptr->length > *out_len)
    {
        printf("encode length too small!\n");
        return -1;
    }
    */

    *out_len = bptr->length;
    memcpy(out, bptr->data, bptr->length);

    BIO_free_all(b64);

    return 0;
}

int openssl_base64_decode(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len)
{
    BIO * bmem = NULL;
    BIO * b64 = NULL;

    if ((NULL == in) || (NULL == out) || (NULL == out_len) || (0 == in_len))
    {
        printf("%s-%d:input paraments error!\n", __FUNCTION__, __LINE__);
        return -1;
    }

    b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bmem = BIO_new_mem_buf((void *)in, in_len);
    bmem = BIO_push(b64, bmem);
    
    *out_len = BIO_read(bmem, out, in_len);
    out[*out_len] = 0;

    BIO_free_all(b64);

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值