汉字的base64编码 wchar_t* buf 来存储汉字;怎么将其进行base64编码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网上找个base64转换的代码对目标字符buffer执行一下就可以了 base64编码解码参考代码:CString Base64Encode(LPCTSTR lpszSrc){ ASSERT(lpszSrc != NULL && AfxIsValidString(lpszSrc)); const char BASE64_ENCODE_TABLE[64] = { 65, 66, 67, 68, 69, 70, 71, 72, // 00 - 07 73, 74, 75, 76, 77, 78, 79, 80, // 08 - 15 81, 82, 83, 84, 85, 86, 87, 88, // 16 - 23 89, 90, 97, 98, 99, 100, 101, 102, // 24 - 31 103, 104, 105, 106, 107, 108, 109, 110, // 32 - 39 111, 112, 113, 114, 115, 116, 117, 118, // 40 - 47 119, 120, 121, 122, 48, 49, 50, 51, // 48 - 55 52, 53, 54, 55, 56, 57, 43, 47 };// 56 - 63 unsigned int iTest; LPCTSTR pInBuffer=lpszSrc; int nSize = (int)_tcslen(lpszSrc); char* pOutBuffer=new char[nSize/3*4+5]; ZeroMemory(pOutBuffer,nSize/3*4+5); for(UINT i=0;i<_tcslen(lpszSrc) / 3;i++) { iTest = (unsigned char) *pInBuffer++; iTest = iTest << 8; iTest = iTest | (unsigned char) *pInBuffer++; iTest = iTest << 8; iTest = iTest | (unsigned char) *pInBuffer++; //以4 byte倒序写入输出缓冲 pOutBuffer[3] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[2] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest]; pOutBuffer+=4; } //设置尾部 switch (_tcslen(lpszSrc) % 3) { case 0: break; case 1: iTest = (unsigned char) *pInBuffer; iTest = iTest << 4; pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest]; pOutBuffer[2] = '='; //用'='也就是64码填充剩余部分 pOutBuffer[3] = '='; break; case 2: iTest = (unsigned char) *pInBuffer++; iTest = iTest << 8; iTest = iTest | (unsigned char) *pInBuffer; iTest = iTest << 2; pOutBuffer[2] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F]; iTest = iTest >> 6; pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest]; pOutBuffer[3] = '='; // Fill remaining byte. break; } pOutBuffer-=nSize/3*4; CString strEncode=pOutBuffer; delete [] pOutBuffer; pOutBuffer=NULL; return strEncode;}CString Base64Decode(LPCTSTR lpszSrc){ ASSERT(lpszSrc != NULL && AfxIsValidString(lpszSrc)); const unsigned int BASE64_DECODE_TABLE[256] = { 255, 255, 255, 255, 255, 255, 255, 255, // 00 - 07 255, 255, 255, 255, 255, 255, 255, 255, // 08 - 15 255, 255, 255, 255, 255, 255, 255, 255, // 16 - 23 255, 255, 255, 255, 255, 255, 255, 255, // 24 - 31 255, 255, 255, 255, 255, 255, 255, 255, // 32 - 39 255, 255, 255, 62, 255, 255, 255, 63, // 40 - 47 52, 53, 54, 55, 56, 57, 58, 59, // 48 - 55 60, 61, 255, 255, 255, 255, 255, 255, // 56 - 63 255, 0, 1, 2, 3, 4, 5, 6, // 64 - 71 7, 8, 9, 10, 11, 12, 13, 14, // 72 - 79 15, 16, 17, 18, 19, 20, 21, 22, // 80 - 87 23, 24, 25, 255, 255, 255, 255, 255, // 88 - 95 255, 26, 27, 28, 29, 30, 31, 32, // 96 - 103 33, 34, 35, 36, 37, 38, 39, 40, // 104 - 111 41, 42, 43, 44, 45, 46, 47, 48, // 112 - 119 49, 50, 51, 255, 255, 255, 255, 255, // 120 - 127 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, 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, 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 }; const int nSrcCount=(int)_tcslen(lpszSrc); int nSize=nSrcCount/4*3; if(lpszSrc[nSrcCount-1]=='=') nSize--; if(lpszSrc[nSrcCount-2]=='=') nSize--; char* pOutBuffer=new char[nSize+3]; ZeroMemory(pOutBuffer,nSize+3); LPCTSTR pInBuffer=lpszSrc; UINT iTest,iPack; for(int i=0;i<nSize/3 ;i++) { for(int j=0;j<4;j++) { iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. //InPtr++; if (iTest == 0xFF) { j--; continue; //读到255非法字符 } iPack = iPack << 6 ; iPack = iPack | iTest ; } pOutBuffer[2] = iPack; iPack = iPack >> 8; pOutBuffer[1] = iPack; iPack = iPack >> 8; pOutBuffer[0] = iPack; //准备写入后3位 pOutBuffer+= 3; iPack = 0; } switch(nSize%3) { case 1: iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6 ; iPack = iPack | iTest ; } iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6 ; iPack = iPack | iTest ; } iPack = iPack >> 4; pOutBuffer[0] = iPack; pOutBuffer++; break; case 2: iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6 ; iPack = iPack | iTest ; } iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6 ; iPack = iPack | iTest ; } iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer. if (iTest != 0xFF) { iPack = iPack << 6 ; iPack = iPack | iTest ; } iPack = iPack >> 2; pOutBuffer[1] = iPack; iPack = iPack >> 8; pOutBuffer[0] = iPack; pOutBuffer+=2; break; default: break; } pOutBuffer-=nSize; CString strDecode=pOutBuffer; delete pOutBuffer; return strDecode;} 我将函数入参由char* 改为unsigned char *后函数可以将汉字进行base64转码,转码结果同网上给的转码小工具GB2312的结果相同。我想知道我要是将wchar_t* 的转为utf-8的再进行base64转码我该如何写?char* CMailTestDlg::Base64IncodeW(unsigned char * Data){ const char Base64table[64]= { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',//0-9 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',//10-19 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',//20-29 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',//30-39 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',//40-49 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',//50-59 '8', '9', '+', '/' }; int len = sizeof(Data); int moduls = len%3;#if 1 int i = 0; int val = 0; int val1 = 0; int val2 = 0; int val3 = 0; int val4 = 0; int currentLen = 0; int codenum = 0;//记录转成base64的字符个数 while(i<len) { if(currentLen > MAX_LENGTH) { m_CurrLength = currentLen; realloc(m_pContent,sizeof(char) * m_CurrLength); } if(i==(len-1)) { if(moduls == 1) { val = Data[i]<<4; val1 = val>>6; val2 = (val & 0x3F); m_pContent[currentLen++] = Base64table[val1]; m_pContent[currentLen++] = Base64table[val2]; m_pContent[currentLen++] = '='; m_pContent[currentLen++] = '='; codenum += 4; i += 1; } else if(moduls == 2) { val = (Data[i]<<10) | (Data[i+1]<<2); val1 = val>>12; val2 = (val & 0xFC0)>>6; val3 = (val & 0x3F); m_pContent[currentLen++] = Base64table[val1]; m_pContent[currentLen++] = Base64table[val2]; m_pContent[currentLen++] = Base64table[val3]; m_pContent[currentLen++] = '='; codenum += 4; i += 2; } } else if(i==(len-2)) { if(moduls == 1) { val = Data[i]<<4; val1 = val>>6; val2 = (val & 0x3F); m_pContent[currentLen++] = Base64table[val1]; m_pContent[currentLen++] = Base64table[val2]; m_pContent[currentLen++] = '='; m_pContent[currentLen++] = '='; codenum += 4; i += 1; } else if(moduls == 2) { val = (Data[i]<<10) | (Data[i+1]<<2); val1 = val>>12; val2 = (val & 0xFC0)>>6; val3 = (val & 0x3F); m_pContent[currentLen++] = Base64table[val1]; m_pContent[currentLen++] = Base64table[val2]; m_pContent[currentLen++] = Base64table[val3]; m_pContent[currentLen++] = '='; codenum += 4; i += 2; } } else { val = (Data[i]<<16)|(Data[i+1])<<8|(Data[i+2]); val1 = val>>18; val2 = (val & 0x3F000) >> 12; val3 = (val & 0xFC0) >>6; val4 = (val & 0x3F); m_pContent[currentLen++] = Base64table[val1]; m_pContent[currentLen++] = Base64table[val2]; m_pContent[currentLen++] = Base64table[val3]; m_pContent[currentLen++] = Base64table[val4]; codenum += 4; if(codenum%76 == 0) { m_pContent[currentLen++] ='\r'; m_pContent[currentLen++] = '\n'; } i += 3; } }#endif return m_pContent;} 查询文件,英语太差,有的语句读取来,总是感觉挂怪的。 CView指针 jiangsheng(蒋晟) 大哥请进!! 如何编程实现禁用和启用网卡 关于界面开发 高分跪求VC++6.0下载地址 *.ico的图标求援-- 用VB能开发轻量控件吗?怎么做? 请教内存清空问题! VC中FormView有控件个数限制,是255个,如何解决? 多线程程序自动停止 新手傳值問題?
{
ASSERT(lpszSrc != NULL && AfxIsValidString(lpszSrc));
const char BASE64_ENCODE_TABLE[64] = {
65, 66, 67, 68, 69, 70, 71, 72, // 00 - 07
73, 74, 75, 76, 77, 78, 79, 80, // 08 - 15
81, 82, 83, 84, 85, 86, 87, 88, // 16 - 23
89, 90, 97, 98, 99, 100, 101, 102, // 24 - 31
103, 104, 105, 106, 107, 108, 109, 110, // 32 - 39
111, 112, 113, 114, 115, 116, 117, 118, // 40 - 47
119, 120, 121, 122, 48, 49, 50, 51, // 48 - 55
52, 53, 54, 55, 56, 57, 43, 47 };// 56 - 63 unsigned int iTest; LPCTSTR pInBuffer=lpszSrc; int nSize = (int)_tcslen(lpszSrc);
char* pOutBuffer=new char[nSize/3*4+5];
ZeroMemory(pOutBuffer,nSize/3*4+5); for(UINT i=0;i<_tcslen(lpszSrc) / 3;i++)
{
iTest = (unsigned char) *pInBuffer++;
iTest = iTest << 8; iTest = iTest | (unsigned char) *pInBuffer++;
iTest = iTest << 8; iTest = iTest | (unsigned char) *pInBuffer++; //以4 byte倒序写入输出缓冲
pOutBuffer[3] = BASE64_ENCODE_TABLE[iTest & 0x3F];
iTest = iTest >> 6;
pOutBuffer[2] = BASE64_ENCODE_TABLE[iTest & 0x3F];
iTest = iTest >> 6;
pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F];
iTest = iTest >> 6;
pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest];
pOutBuffer+=4;
} //设置尾部
switch (_tcslen(lpszSrc) % 3)
{
case 0:
break;
case 1:
iTest = (unsigned char) *pInBuffer;
iTest = iTest << 4;
pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F];
iTest = iTest >> 6;
pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest];
pOutBuffer[2] = '='; //用'='也就是64码填充剩余部分
pOutBuffer[3] = '=';
break;
case 2:
iTest = (unsigned char) *pInBuffer++;
iTest = iTest << 8;
iTest = iTest | (unsigned char) *pInBuffer;
iTest = iTest << 2;
pOutBuffer[2] = BASE64_ENCODE_TABLE[iTest & 0x3F];
iTest = iTest >> 6;
pOutBuffer[1] = BASE64_ENCODE_TABLE[iTest & 0x3F];
iTest = iTest >> 6;
pOutBuffer[0] = BASE64_ENCODE_TABLE[iTest];
pOutBuffer[3] = '='; // Fill remaining byte.
break;
}
pOutBuffer-=nSize/3*4;
CString strEncode=pOutBuffer;
delete [] pOutBuffer;
pOutBuffer=NULL;
return strEncode;
}CString Base64Decode(LPCTSTR lpszSrc)
{
ASSERT(lpszSrc != NULL && AfxIsValidString(lpszSrc));
const unsigned int BASE64_DECODE_TABLE[256] = {
255, 255, 255, 255, 255, 255, 255, 255, // 00 - 07
255, 255, 255, 255, 255, 255, 255, 255, // 08 - 15
255, 255, 255, 255, 255, 255, 255, 255, // 16 - 23
255, 255, 255, 255, 255, 255, 255, 255, // 24 - 31
255, 255, 255, 255, 255, 255, 255, 255, // 32 - 39
255, 255, 255, 62, 255, 255, 255, 63, // 40 - 47
52, 53, 54, 55, 56, 57, 58, 59, // 48 - 55
60, 61, 255, 255, 255, 255, 255, 255, // 56 - 63
255, 0, 1, 2, 3, 4, 5, 6, // 64 - 71
7, 8, 9, 10, 11, 12, 13, 14, // 72 - 79
15, 16, 17, 18, 19, 20, 21, 22, // 80 - 87
23, 24, 25, 255, 255, 255, 255, 255, // 88 - 95
255, 26, 27, 28, 29, 30, 31, 32, // 96 - 103
33, 34, 35, 36, 37, 38, 39, 40, // 104 - 111
41, 42, 43, 44, 45, 46, 47, 48, // 112 - 119
49, 50, 51, 255, 255, 255, 255, 255, // 120 - 127
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, 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, 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 };
const int nSrcCount=(int)_tcslen(lpszSrc);
int nSize=nSrcCount/4*3;
if(lpszSrc[nSrcCount-1]=='=')
nSize--;
if(lpszSrc[nSrcCount-2]=='=')
nSize--;
char* pOutBuffer=new char[nSize+3];
ZeroMemory(pOutBuffer,nSize+3);
LPCTSTR pInBuffer=lpszSrc;
UINT iTest,iPack;
for(int i=0;i<nSize/3 ;i++)
{
for(int j=0;j<4;j++)
{
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
//InPtr++;
if (iTest == 0xFF)
{
j--;
continue; //读到255非法字符
}
iPack = iPack << 6 ;
iPack = iPack | iTest ;
}
pOutBuffer[2] = iPack;
iPack = iPack >> 8;
pOutBuffer[1] = iPack;
iPack = iPack >> 8;
pOutBuffer[0] = iPack;
//准备写入后3位
pOutBuffer+= 3; iPack = 0; }
switch(nSize%3)
{
case 1:
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6 ;
iPack = iPack | iTest ;
}
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6 ;
iPack = iPack | iTest ;
}
iPack = iPack >> 4;
pOutBuffer[0] = iPack;
pOutBuffer++;
break;
case 2:
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6 ;
iPack = iPack | iTest ;
}
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6 ;
iPack = iPack | iTest ;
}
iTest = BASE64_DECODE_TABLE[*pInBuffer++]; // Read from InputBuffer.
if (iTest != 0xFF)
{
iPack = iPack << 6 ;
iPack = iPack | iTest ;
}
iPack = iPack >> 2;
pOutBuffer[1] = iPack;
iPack = iPack >> 8;
pOutBuffer[0] = iPack;
pOutBuffer+=2;
break;
default:
break;
}
pOutBuffer-=nSize;
CString strDecode=pOutBuffer;
delete pOutBuffer;
return strDecode;
}
char* CMailTestDlg::Base64IncodeW(unsigned char * Data)
{
const char Base64table[64]=
{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',//0-9
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',//10-19
'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',//20-29
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',//30-39
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',//40-49
'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',//50-59
'8', '9', '+', '/'
}; int len = sizeof(Data);
int moduls = len%3;
#if 1
int i = 0;
int val = 0;
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int currentLen = 0;
int codenum = 0;//记录转成base64的字符个数
while(i<len)
{
if(currentLen > MAX_LENGTH)
{
m_CurrLength = currentLen;
realloc(m_pContent,sizeof(char) * m_CurrLength);
}
if(i==(len-1))
{
if(moduls == 1)
{
val = Data[i]<<4;
val1 = val>>6;
val2 = (val & 0x3F);
m_pContent[currentLen++] = Base64table[val1];
m_pContent[currentLen++] = Base64table[val2]; m_pContent[currentLen++] = '=';
m_pContent[currentLen++] = '=';
codenum += 4;
i += 1;
}
else if(moduls == 2)
{
val = (Data[i]<<10) | (Data[i+1]<<2);
val1 = val>>12;
val2 = (val & 0xFC0)>>6;
val3 = (val & 0x3F);
m_pContent[currentLen++] = Base64table[val1];
m_pContent[currentLen++] = Base64table[val2];
m_pContent[currentLen++] = Base64table[val3];
m_pContent[currentLen++] = '=';
codenum += 4;
i += 2;
}
}
else if(i==(len-2))
{
if(moduls == 1)
{
val = Data[i]<<4;
val1 = val>>6;
val2 = (val & 0x3F);
m_pContent[currentLen++] = Base64table[val1];
m_pContent[currentLen++] = Base64table[val2]; m_pContent[currentLen++] = '=';
m_pContent[currentLen++] = '=';
codenum += 4;
i += 1;
}
else if(moduls == 2)
{
val = (Data[i]<<10) | (Data[i+1]<<2);
val1 = val>>12;
val2 = (val & 0xFC0)>>6;
val3 = (val & 0x3F);
m_pContent[currentLen++] = Base64table[val1];
m_pContent[currentLen++] = Base64table[val2];
m_pContent[currentLen++] = Base64table[val3];
m_pContent[currentLen++] = '=';
codenum += 4;
i += 2;
}
}
else
{
val = (Data[i]<<16)|(Data[i+1])<<8|(Data[i+2]);
val1 = val>>18;
val2 = (val & 0x3F000) >> 12;
val3 = (val & 0xFC0) >>6;
val4 = (val & 0x3F); m_pContent[currentLen++] = Base64table[val1];
m_pContent[currentLen++] = Base64table[val2];
m_pContent[currentLen++] = Base64table[val3];
m_pContent[currentLen++] = Base64table[val4]; codenum += 4;
if(codenum%76 == 0)
{
m_pContent[currentLen++] ='\r';
m_pContent[currentLen++] = '\n';
}
i += 3;
}
}
#endif
return m_pContent;
}