松鼠的博客

导航

统计

Base64编解码

编码函数

 

复制代码
代码
const BYTE Base64ValTab[65= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

#define AVal(x) Base64ValTab[x]

int EncodeBase64(char * pInput, char * pOutput)
{
    
int i = 0;
    
int loop = 0;
    
int remain = 0;
    
int iDstLen = 0;
    
int iSrcLen = (int)strlen(pInput);

    loop 
= iSrcLen/3;
    remain 
= iSrcLen%3;

    
// also can encode native char one by one as decode method
    
// but because all of char in native string  is to be encoded so encode 3-chars one time is easier.

    
for (i=0; i<loop; i++)
    {
        BYTE a1 
= (pInput[i*3>> 2);
        BYTE a2 
= ( ((pInput[i*3& 0x03<< 4| (pInput[i*3+1>> 4) );
        BYTE a3 
= ( ((pInput[i*3+1& 0x0F<< 2| ((pInput[i*3+2& 0xC0>> 6) );
        BYTE a4 
= (pInput[i*3+2& 0x3F);

        pOutput[i
*4= AVal(a1);
        pOutput[i
*4+1= AVal(a2);
        pOutput[i
*4+2= AVal(a3);
        pOutput[i
*4+3= AVal(a4);
    }

    iDstLen 
= i*4;

    
if (remain == 1)
    {
        
// should pad two equal sign
        i = iSrcLen-1;
        BYTE a1 
= (pInput[i] >> 2);
        BYTE a2 
= ((pInput[i] & 0x03<< 4);
        
        pOutput[iDstLen
++= AVal(a1);
        pOutput[iDstLen
++= AVal(a2);
        pOutput[iDstLen
++= '=';
        pOutput[iDstLen
++= '=';
        pOutput[iDstLen] 
= 0x00;
    }
    
else if (remain == 2)
    {
        
// should pad one equal sign
        i = iSrcLen-2;
        BYTE a1 
= (pInput[i] >> 2);
        BYTE a2 
= ( ((pInput[i] & 0x03<< 4| (pInput[i+1>> 4));
        BYTE a3 
= ( (pInput[i+1& 0x0F<< 2);

        pOutput[iDstLen
++= AVal(a1);
        pOutput[iDstLen
++= AVal(a2);
        pOutput[iDstLen
++= AVal(a3);
        pOutput[iDstLen
++= '=';
        pOutput[iDstLen] 
= 0x00;
    }
    
else
    {
        
// just division by 3
        pOutput[iDstLen] = 0x00;
    }
    
return iDstLen;
}
复制代码

 

 

解码函数

 

复制代码
代码
const BYTE Base64IdxTab[128=
{
    
255,255,255,255,  255,255,255,255,  255,255,255,255,  255,255,255,255,
    
255,255,255,255,  255,255,255,255,  255,255,255,255,  255,255,255,255,
    
255,255,255,255,  255,255,255,255,  255,255,255,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,255,     255,255,255,255
};

#define BVal(x) Base64IdxTab[x]

int DecodeBase64(char * pInput, char * pOutput)
{
    
int i = 0;
    
int iCnt = 0;
    
int iSrcLen = (int)strlen(pInput);

    
char * p = pOutput;

    
for (i=0; i<iSrcLen; i++)
    {
        
if (pInput[i] > 127continue;
        
if (pInput[i] == '='return p-pOutput+1;

        BYTE a 
= BVal(pInput[i]);
        
if (a == 255continue;
        
        
switch (iCnt)
        {
        
case 0:
            {
                
*= a << 2;
                iCnt
++;
            }
            
break;

        
case 1:
            {
                
*p++ |= a >> 4;
                
*= a << 4;
                iCnt
++;
            }
            
break;

        
case 2:
            {
                
*p++ |= a >> 2;
                
*= a << 6;
                iCnt
++;
            }
            
break;

        
case 3:
            {
                
*p++ |= a;
                iCnt 
= 0;
            }
            
break;
        } 
    }

    
*= 0x00;
    
return p-pOutput;
}
复制代码

 

 

posted on   Xproer-松鼠  阅读(313)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示