C:简单实现BaseCode64编码

What is Base64?

前言

目前来看遇到过Base 16、Base 32、Base 64的编解码,这种编码格式是二进制和文本编码转化,是对称并且可逆的转化。Base 64总共有64个ASCII码字符,包括A-Z,a-z,0-9,“+”和“/ ”。详细介绍可以参考了这篇文章,对Base 64的原理做了比较详细的介绍。

编码原理

转换

Base 64编码的64个ASCII字符需要6位数据,假设将二进制
000000编码为字符 ‘A’
000001编码为字符 ‘B’
000010编码为字符 ‘C’
(当然具体的编码关系需要根据编码表进行映射)

那么一个24 bit的二进制数据
000001 000000 000000 000000
编码后得到
BAAA

不难发现Base 64编码是将 3 x 8 bit 的数据编码为 4 x 6 bit的数据,每个6 bit的数据通过编码表 的映射关系得到一串编码后的字符串。

如果遇到剩下的字符不足3个字节,则用0填充,1个字节或者2个字节的情况,最后用‘=’补齐

编码表

如下图所示
编码表

如下 Table[]是自定义的一个编码表,当然表中的字符顺序不是固定,可以变换顺序

char Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
               "abcdefghijklmnopqrstuvwxyz"\
               "0123456789+/";

编解码实现

编码

void EncodeBase64(char *dst,char *src,int length)
{   
    int j = 0;
    int i = 0;
    for ( i=0; i<length; i++)
    {       
        j = i / 3 * 4;
        if (i % 3 == 0)
        {
            if ((length - i) < 3 && (length - i) > 0)
            {
                dst[j] = Table[((src[i] & 0xFC) >> 2) & 0x3F];
                dst[j + 1] = Table[(((src[i] & 0x03) << 4) | ((src[i + 1] & 0xF0) >> 4)) & 0x3F];
                switch (length%3)
                {
                case 1:
                    dst[j + 2] = '=';
                    dst[j + 3] = '=';
                    break;
                case 2:
                    dst[j + 2] = Table[((src[i + 1] & 0x0F)<<2) & 0x3F];;
                    dst[j + 3] = '=';
                    break;
                default:                    
                    break;
                }
                break;
            }           
            dst[j] = Table[((src[i] & 0xFC) >> 2) & 0x3F];
            dst[j + 1] = Table[(((src[i] & 0x03) << 4) | ((src[i + 1] & 0xF0) >> 4)) & 0x3F];
            dst[j + 2] = Table[(((src[i + 2] & 0xC0) >> 6) & 0x03) | (((src[i + 1] & 0x0F) << 2))];
            dst[j + 3] = Table[(src[i + 2] & 0x3F) & 0x3F];
        }               
    }
}

解码

char FindHexCode(char temp)
{
    char *pbuff = Table;
    int index = 0;
    while (*pbuff != '=')
    {
        if (temp == pbuff[index])
        {
            break;
        }
        index++;
    }
    return index;
}

void DecodeBase64(char *dst,char *src, int length)
{
    int i = 0;
    int j = 0;
    char temp[4] = { 0 };
    for (i=0;i<length;i++)
    {
        j = i / 4 * 3;
        if ( i%4 == 0 )
        {
            for (int k=0;k<4;k++)
            {
                temp[k] = FindHexCode(src[i + k]);
            }
            dst[j] = ((temp[0] << 2) & 0xFC) | ((temp[1] >> 4) & 0x03);
            dst[j + 1] = ((temp[1] << 4) & 0xF0) | ((temp[2] >> 2) & 0x0F);
            dst[j + 2] = ( (temp[2]<<6) & 0xC0) | temp[3];
        }       
    }
}

测试

int main()
{
    char buff[1024] = { 0 };
    char test[] = "www.greywalltech.com";
    char Result[1024] = { 0 };
    EncodeBase64(buff,test, strlen(test));
    std::cout << "Base 64 Encode:" << buff << std::endl;
    DecodeBase64(Result,buff,strlen(buff));
    std::cout << "Base 64 Decode:" << Result << std::endl;
    return 0;
}

运行结果

使用相同的编码表,在线进行编码生成的base64加密结果如下图所示:
在线编码

完整代码下载
http://download.csdn.net/detail/u010632165/9681969

posted @ 2016-11-14 10:22  小麦大叔  阅读(216)  评论(0编辑  收藏  举报