首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

base64解码的类,可以支持中文的

2012-02-06 
求一个base64解码的类,可以支持中文的有没有人有这个解码的类啊,我在网上找了很久都没有找到有中文的解码

求一个base64解码的类,可以支持中文的
有没有人有这个解码的类啊,我在网上找了很久都没有找到有中文的解码的,要求能解gb2312等之类的中文编码的

[解决办法]
//base64解码,支持gbk/gb2312/utf-8
char *DecodeBase64(char *data)
{
char inalphabet[256], decoder[256];
memset(inalphabet, 0, sizeof(inalphabet));
memset(decoder, 0, sizeof(decoder));

for(int i = strlen(Widgets::s_alphabet) - 1; i >= 0; i--) {
inalphabet[(unsigned int) Widgets::s_alphabet[i]] = 1;
decoder[(unsigned int) Widgets::s_alphabet[i]] = i;
}

char *indata = data;
char *outdata = data;

int bits = 0;
int c;
int char_count = 0;
int errors = 0;

while((c = *indata++) != '\0') {
if(c == '=')
break;

if(c > 255 || ! inalphabet[c])
continue;

bits += decoder[c];
char_count++;

if(char_count == 4) {
*outdata++ = (bits >> 16);
*outdata++ = ((bits >> 8) & 0xff);
*outdata++ = (bits & 0xff);
bits = 0;
char_count = 0;
}
else
bits <<= 6;
}

if(c == '\0') {
if(char_count) {
PR_DEBUG("base64 encoding incomplete: at least %d bits truncated", ((4 - char_count) * 6));
errors++;
}
}
else {
// c == '='
switch(char_count) {
case 1:
PR_DEBUG("base64 encoding incomplete: at least 2 bits missing");
errors++;
break;
case 2:
*outdata++ = (bits >> 10);
break;
case 3:
*outdata++ = (bits >> 16);
*outdata++ = ((bits >> 8) & 0xff);
break;
}
}

*outdata = '\0';

return errors ? 0 : data;
}

//base64编码,支持gbk/gb2312/utf-8
char *EncodeBase64(char *data)
{
char buf[BUFSIZ];
int c;
int error;
int char_count = 0;
int bits = 0;
error = 0;
char *indata = data;
char *outdata = buf;
const unsigned char ASCII_MAX = ~0;

while((c = *indata++) != '\0') {
if(c > (int)ASCII_MAX) {
PR_DEBUG("encountered char > 255 (decimal %d)", c);
error++;
break;
}

bits += c;
char_count++;

if(char_count == 3) {
*outdata++ = Widgets::s_alphabet[bits >> 18];
*outdata++ = Widgets::s_alphabet[(bits >> 12) & 0x3f];
*outdata++ = Widgets::s_alphabet[(bits >> 6) & 0x3f];
*outdata++ = Widgets::s_alphabet[bits & 0x3f];
bits = 0;
char_count = 0;
}
else
bits <<= 8;
}

if(!error) {
if(char_count != 0) {
bits <<= 16 - (8 * char_count);
*outdata++ = Widgets::s_alphabet[bits >> 18];
*outdata++ = Widgets::s_alphabet[(bits >> 12) & 0x3f];

if(char_count == 1) {
*outdata++ = '=';
*outdata++ = '=';
}
else {
*outdata++ = Widgets::s_alphabet[(bits >> 6) & 0x3f];
*outdata++ = '=';
}
}

*outdata = '\0';
strcpy(data, buf);
}

return (error ? 0 : data);
}

[解决办法]

探讨



引用:
LPWSTR(WCHAR*)还是LPSTR(CHAR*)?

或者说

你怎么确定网上找的那些类进行中文解码不行?


我在网上找到的解完后都是无法显示的

热点排行