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;
}
#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] > 127) continue;
if (pInput[i] == '=') return p-pOutput+1;
BYTE a = BVal(pInput[i]);
if (a == 255) continue;
switch (iCnt)
{
case 0:
{
*p = a << 2;
iCnt++;
}
break;
case 1:
{
*p++ |= a >> 4;
*p = a << 4;
iCnt++;
}
break;
case 2:
{
*p++ |= a >> 2;
*p = a << 6;
iCnt++;
}
break;
case 3:
{
*p++ |= a;
iCnt = 0;
}
break;
}
}
*p = 0x00;
return p-pOutput;
}
{
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] > 127) continue;
if (pInput[i] == '=') return p-pOutput+1;
BYTE a = BVal(pInput[i]);
if (a == 255) continue;
switch (iCnt)
{
case 0:
{
*p = a << 2;
iCnt++;
}
break;
case 1:
{
*p++ |= a >> 4;
*p = a << 4;
iCnt++;
}
break;
case 2:
{
*p++ |= a >> 2;
*p = a << 6;
iCnt++;
}
break;
case 3:
{
*p++ |= a;
iCnt = 0;
}
break;
}
}
*p = 0x00;
return p-pOutput;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了