base64

#include <stdio.h>
#include <memory.h>

/* ascii -->  index */
unsigned char base64_table[] = {
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz"
    "0123456789+/"
};

/* index --> ascii */
unsigned char base64_index[] = {
    62,255,255,255,63,52,53,54,55,56,57,58,59,60,61,
    255,255,255,255,255,255,255,
    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
    255,255,255,255,255,255,
    26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51
};

int base64_encode(const unsigned char* input, unsigned char* output)
{
    if (NULL == input || NULL == output)
        return -1;

    unsigned int in_len = strlen(input);

    if (0 == in_len)
        return -1;

    unsigned int i = 0;
    int j = 0;
    for (i=0; i<in_len; )
    {
        unsigned char index = input[i] >> 2;
        output[j++] = base64_table[index];
        if (i+1 == in_len)
        {
            index = (unsigned char)(input[i] << 6) >> 2;
            output[j++] = base64_table[index];
            output[j++] = '=';
            output[j++] = '=';
            break;
        }
        index = (unsigned char)(input[i] << 6) >> 2 | input[i+1] >> 4;
        output[j++] = base64_table[index];

        if (i+2 == in_len)
        {
            index = (unsigned char)(input[i+1] << 4) >> 2;
            output[j++] = base64_table[index];
            output[j++] = '=';
            break;
        }
        index = (unsigned char)(input[i+1] << 4) >> 2 | input[i+2] >> 6;
        output[j++] = base64_table[index];

        index = (unsigned char)(input[i+2] << 2) >> 2;
        output[j++] = base64_table[index];


        i += 3;
    }

    return j;
}

int base64_decode(const unsigned char* input, unsigned char* output)
{
    if (NULL == input || NULL == output)
        return -1;

    unsigned int in_len = strlen(input);
    if (0 == in_len)
        return -1;

    unsigned int i = 0;
    int j = 0;
    for (i=0; i<in_len; i+=4)
    {
        unsigned char buf[4] = {0};
        buf[0] = base64_index[input[i]-'+'];
        buf[1] = base64_index[input[i+1]-'+'];

        unsigned char c = buf[0] << 2 | buf[1] >> 4;
        output[j++] = c;

        if ('=' == input[i+2])
            break;

        buf[2] = base64_index[input[i+2]-'+'];
        c = buf[1] << 4 | buf[2] >> 2;
        output[j++] = c;

        if ('=' == input[i+3])
            break;

        buf[3] = base64_index[input[i+3]-'+'];
        c = buf[2] << 6 | buf[3];
        output[j++] = c;
    }

    return j;
}


转载于:https://my.oschina.net/jiuyueshouyi/blog/486430

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值