zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ASP.NET使用UEditor入门与常见问题
    关于发布者策略程序集学习记录
    Myeclipse 10安装,以及Flex4插件(原)
    IE、Chrome等浏览器实现PDF预览(原)
    Oracle数据库中文显示乱码的最简单解决办法
    关于程序集的结构(2)C#和.NET2.0实战学习笔记
    关于AppDomain
    关于强名称程序集 C#和.NET2.0实战学习记录
    数据库查询·聚合分支格式化日期·思维导图&要点&误点(含示例)
    如何在SERVER2003上安装MySQL?(附安装教程及资源地址)
  • 原文地址:https://www.cnblogs.com/unclemac/p/12783448.html
Copyright © 2011-2022 走看看