Base64的编解码方法
2008-12-24 19:39:59 来源:WEB开发网输入缓冲的末尾 可能余下一个字符,或两个字符:
如果余下一个字 符,前6个bit转换成Base64,剩下的低2位要右边补0 ,凑成6bit,然后转换成Base64,为了让解析者了解 这个 情况,在输出缓冲的最后要补上两个'='。
如果余下两个字符,同样转换出两个Base64 字符后,在剩下的4个bit右边补0,凑成6bit,然后转 换成Base64,同样在输出缓冲 的末尾要补上一个'=' 。
由此可见Base64 后的字符串,长度一定是4的整数倍,末尾有一个,两 个或没有'='。
要注意的是为了兼容有些邮件服务器, Base64后的字符串经常要插入来确保每一行 不超过76个字符,解析时要跳过它们。
好了,原理就是 这样的,是不是很简单,就是取3个转成4个,好了, 上代码:
首先是编码:
const BYTE Base64ValTab[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
#define AVal(x) Base64ValTab[x]
int CSeeBase64Dlg::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;
}
- ››Base64编码
- ››Base64的编解码方法
- ››方法 (Array)
- ››Base64编码的Java语言实现
- ››方法和作用域中的内部类
- ››方法调用的绑定
更多精彩
赞助商链接