base64学习

一种基于64个可打印字符[A~Z,a~z,0~9,+,/]来标识二进制数据的编码方式,多用于网络传输。

 

编码规则:

1) 3bytes-----24bits: 11111111 11111111 11111111

2) 24bits+3*2bits,将二进制编码6bits一组,每组前两bit0,成为新的4字节数据:00111111 00111111 00111111 00111111

3)base64表:0~63A-Z,a~z,0~9,+,/。得到:base64编码为

 

1byte:11111111 ->00111111 00110000

-> /w==(转换后不足4字节,补==)

 

2byte:11111111 11111111 ->00111111 00111111 00111100

-> //8=(转换后不足4字节,补=)

 

解码规则:

1) 依据[A~Z,a~z,0~9,+,/],找到对应的0-63码值,恢复二进制编码。

2) 4字节base码按规则恢复为3字节普通ascii码,并存储ascii码。

3) 注意:base64码数目一定是4的倍数。解码时===\r\n也忽略。



代码网上转载:

string ZBase64::Encode(const unsigned char* Data,int DataByte)  

    {  

        //编码表  

        const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  

        //返回值  

        string strEncode;  

        unsigned char Tmp[4]={0};  

        int LineLength=0;  

        for(int i=0;i<(int)(DataByte / 3);i++)  

        {  

            Tmp[1] = *Data++;  

            Tmp[2] = *Data++;  

            Tmp[3] = *Data++;  

            strEncode+= EncodeTable[Tmp[1] >> 2];  

            strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];  

            strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];  

            strEncode+= EncodeTable[Tmp[3] & 0x3F];  

            if(LineLength+=4,LineLength==76)

            {strEncode+="\r\n";LineLength=0;}

        }  

        //对剩余数据进行编码  

        int Mod=DataByte % 3;  

        if(Mod==1)  

        {  

            Tmp[1] = *Data++;  

            strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];  

            strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];  

            strEncode+= "==";  

        }  

        else if(Mod==2)  

        {  

            Tmp[1] = *Data++;  

            Tmp[2] = *Data++;  

            strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];  

            strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];  

            strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];  

            strEncode+= "=";  

        }  

          

        return strEncode;  

    }  

      

    string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)  

    {  

        //解码表  

        const char DecodeTable[] =  

        {  

            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  

            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  

            62, // '+'  

            0, 0, 0,  

            63, // '/'  

            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'  

            0, 0, 0, 0, 0, 0, 0,  

            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, // 'A'-'Z'  

            0, 0, 0, 0, 0, 0,  

            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, // 'a'-'z'  

        };  

        //返回值  

        string strDecode;  

        int nValue;  

        int i= 0;  

        while (i < DataByte)  

        {  

            if (*Data != '\r' && *Data!='\n')  

            {  

                nValue = DecodeTable[*Data++] << 18;  

                nValue += DecodeTable[*Data++] << 12;  

                strDecode+=(nValue & 0x00FF0000) >> 16;  

                OutByte++;  

                if (*Data != '=')  

                {  

                    nValue += DecodeTable[*Data++] << 6;  

                    strDecode+=(nValue & 0x0000FF00) >> 8;  

                    OutByte++;  

                    if (*Data != '=')  

                    {  

                        nValue += DecodeTable[*Data++];  

                        strDecode+=nValue & 0x000000FF;  

                        OutByte++;  

                    }  

                }  

                i += 4;  

            }  

            else// 回车换行,跳过  

            {  

                Data++;  

                i++;  

            }  

         }  

        return strDecode;  

    }  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值