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

解析GB2312码和一个dos命令执行结果的保存有关问题

2012-02-11 
解析GB2312码和一个dos命令执行结果的保存问题问题1:一个获取邮箱信件的程序,当取到每封邮件的题目(Subjec

解析GB2312码和一个dos命令执行结果的保存问题
问题1:一个获取邮箱信件的程序,当取到每封邮件的题目(Subject)如下:
Subject:
  =?GB2312?B?ufm9qM6wINH7x+vE+r+qyeggR29vZ2xlILXn19PTyrz+1cq7pw==?=
请问如何才能转化为正常的汉字?解析完正确的标题是“郭建伟   邀请您开设免费的   Gmail   帐户。”
/********************************************************************/
        问题2:再次提问如何才能把二级DOS命令执行的结果保存到文本文档,比如命令nslookup,一般用system( "nslookup   > >   log.txt ")可以保存,但这样只能保存nslookup进去的那个页面,但我想在进入nslookup的界面再输入set   debug等参数后再执行域名解析的执行结果也保存下来。

      请问该如何编程实现?不知道说清楚没有,求助

[解决办法]
还有 < < 和 |命令呀,google吧。
[解决办法]
ufm9qM6wINH7x+vE+r+qyeggR29vZ2xlILXn19PTyrz+1cq7pw==
是用 base64 编码的,网上找个算法转换一下就出来了
[解决办法]
Byte DecodeBase64_Char2Byte(char org)
{
if(org> = 'A '&&org <= 'Z ')
return org-65;
if(org> = 'a '&&org <= 'z ')
return org-71;
if(org> = '0 '&&org <= '9 ')
return org+4;
if(org== '+ ')
return 62;
if(org== '/ ')
return 63;
if(org== '= ')
return 64;
return 255;
}

AnsiString DecodeBase64_Sub(AnsiString substr)
{
Byte te;
Byte re[3];
Byte co[4];
int i;
AnsiString rec;
rec = " ";
for (i = 0 ;i <4 ;i++)
co[i] = DecodeBase64_Char2Byte(substr.c_str()[i]);

re[0] = co[0] < < 2;
te = Byte(co[1]&0x30);
re[0] = Byte(re[0] | (te > > 4));
re[1] = co[1] < < 4;
te = Byte(co[2] &0x3c);
re[1] = Byte(re[1] | (te > > 2));

re[2] = co[2] < < 6;
re[2] = Byte(re[2] | (co[3] &0x3f));
rec= " ";
for (i= 0;i <3;i++)
rec +=AnsiString(Char(re[i]));
return AnsiString(rec);
}

AnsiString DecodeBase64(AnsiString org)
{
AnsiString ter;
int i;
int len;
AnsiString substr;
int size;
ter = " ";
substr = " ";
len = org.Length();
size = 1;
for (i = 1 ;i <= len ;i++)
{
substr[size] = org[i];
size++;
if (size > 4)
{
ter = ter + DecodeBase64_Sub(substr);
size = 1;
}
}
return ter;
}

[解决办法]
问题1:可以使用BASE64的算法进行转换(网上搜索“Base64算法”有一大把“)
问题2:可以使用nslookup对应的子命令,并使用DOS中的重定向符号!
举例说明:
system( "nslookup -set debug> > log.txt ")


[解决办法]
1:

////////////////////////////////////////////////////////////
// base64.h

// 参考文章:http://www.cstc.net.cn/docs/docs.php?id=202

//************************************************************************/
// base64编码表
//
//0 A 17 R 34 i 51 z
//1 B 18 S 35 j 52 0
//2 C 19 T 36 k 53 1
//3 D 20 U 37 l 54 2
//4 E 21 V 38 m 55 3
//5 F 22 W 39 n 56 4
//6 G 23 X 40 o 57 5
//7 H 24 Y 41 p 58 6
//8 I 25 Z 42 q 59 7
//9 J 26 a 43 r 60 8
//10 K 27 b 44 s 61 9
//11 L 28 c 45 t 62 +
//12 M 29 d 46 u 63 /
//13 N 30 e 47 v (pad) =
//14 O 31 f 48 w
//15 P 32 g 49 x
//16 Q 33 h 50 y
//
// base64编码步骤:
//
//原文:
//
//你好
//C4 E3 BA C3
//11000100 11100011 10111010 11000011
//00110001 00001110 00001110 00111010
//49 14(十进制)
//x O O 6字符
//01111000 01001111 01001111 00110110
//78(十六进制)
//xOO6
//
//解码:
//xOO6
//78 4f 4f 36
//01111000 01001111 01001111 00110110
//49 14
//00110001 00001110 00001110 00111010 31 0e 0e 3a
//
//11000100 11100011 10111010
//C4 E3 BA
//

#ifndef _BASE64_INCLUDE__H__
#define _BASE64_INCLUDE__H__

// 编码后的长度一般比原文多占1/3的存储空间,请保证base64code有足够的空间
inline int Base64Encode(char * base64code, const char * src, int src_len = 0);
inline int Base64Decode(char * buf, const char * base64code, int src_len = 0);

__inline char GetB64Char(int index)
{
const char szBase64Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ ";
if (index > = 0 && index < 64)
return szBase64Table[index];

return '= ';
}

// 从双字中取单字节
#define B0(a) (a & 0xFF)
#define B1(a) (a > > 8 & 0xFF)
#define B2(a) (a > > 16 & 0xFF)
#define B3(a) (a > > 24 & 0xFF)

// 编码后的长度一般比原文多占1/3的存储空间,请保证base64code有足够的空间
inline int Base64Encode(char * base64code, const char * src, int src_len)
{
if (src_len == 0)
src_len = strlen(src);

int len = 0;
unsigned char* psrc = (unsigned char*)src;
char * p64 = base64code;
for (int i = 0; i < src_len - 3; i += 3)
{
unsigned long ulTmp = *(unsigned long*)psrc;
register int b0 = GetB64Char((B0(ulTmp) > > 2) & 0x3F);
register int b1 = GetB64Char((B0(ulTmp) < < 6 > > 2 | B1(ulTmp) > > 4) & 0x3F);
register int b2 = GetB64Char((B1(ulTmp) < < 4 > > 2 | B2(ulTmp) > > 6) & 0x3F);
register int b3 = GetB64Char((B2(ulTmp) < < 2 > > 2) & 0x3F);
*((unsigned long*)p64) = b0 | b1 < < 8 | b2 < < 16 | b3 < < 24;
len += 4;
p64 += 4;
psrc += 3;
}

// 处理最后余下的不足3字节的饿数据
if (i < src_len)
{
int rest = src_len - i;
unsigned long ulTmp = 0;
for (int j = 0; j < rest; ++j)
{
*(((unsigned char*)&ulTmp) + j) = *psrc++;
}

p64[0] = GetB64Char((B0(ulTmp) > > 2) & 0x3F);
p64[1] = GetB64Char((B0(ulTmp) < < 6 > > 2 | B1(ulTmp) > > 4) & 0x3F);
p64[2] = rest > 1 ? GetB64Char((B1(ulTmp) < < 4 > > 2 | B2(ulTmp) > > 6) & 0x3F) : '= ';
p64[3] = rest > 2 ? GetB64Char((B2(ulTmp) < < 2 > > 2) & 0x3F) : '= ';


p64 += 4;
len += 4;
}

*p64 = '\0 ';

return len;
}


__inline int GetB64Index(char ch)
{
int index = -1;
if (ch > = 'A ' && ch <= 'Z ')
{
index = ch - 'A ';
}
else if (ch > = 'a ' && ch <= 'z ')
{
index = ch - 'a ' + 26;
}
else if (ch > = '0 ' && ch <= '9 ')
{
index = ch - '0 ' + 52;
}
else if (ch == '+ ')
{
index = 62;
}
else if (ch == '/ ')
{
index = 63;
}

return index;
}

// 解码后的长度一般比原文少用占1/4的存储空间,请保证buf有足够的空间
inline int Base64Decode(char * buf, const char * base64code, int src_len)
{
if (src_len == 0)
src_len = strlen(base64code);

int len = 0;
unsigned char* psrc = (unsigned char*)base64code;
char * pbuf = buf;
for (int i = 0; i < src_len - 4; i += 4)
{
unsigned long ulTmp = *(unsigned long*)psrc;

register int b0 = (GetB64Index((char)B0(ulTmp)) < < 2 | GetB64Index((char)B1(ulTmp)) < < 2 > > 6) & 0xFF;
register int b1 = (GetB64Index((char)B1(ulTmp)) < < 4 | GetB64Index((char)B2(ulTmp)) < < 2 > > 4) & 0xFF;
register int b2 = (GetB64Index((char)B2(ulTmp)) < < 6 | GetB64Index((char)B3(ulTmp)) < < 2 > > 2) & 0xFF;

*((unsigned long*)pbuf) = b0 | b1 < < 8 | b2 < < 16;
psrc += 4;
pbuf += 3;
len += 3;
}

// 处理最后余下的不足4字节的饿数据
if (i < src_len)
{
int rest = src_len - i;
unsigned long ulTmp = 0;
for (int j = 0; j < rest; ++j)
{
*(((unsigned char*)&ulTmp) + j) = *psrc++;
}

register int b0 = (GetB64Index((char)B0(ulTmp)) < < 2 | GetB64Index((char)B1(ulTmp)) < < 2 > > 6) & 0xFF;
*pbuf++ = b0;
len ++;

if ( '= ' != B1(ulTmp) && '= ' != B2(ulTmp))
{
register int b1 = (GetB64Index((char)B1(ulTmp)) < < 4 | GetB64Index((char)B2(ulTmp)) < < 2 > > 4) & 0xFF;
*pbuf++ = b1;
len ++;
}

if ( '= ' != B2(ulTmp) && '= ' != B3(ulTmp))
{
register int b2 = (GetB64Index((char)B2(ulTmp)) < < 6 | GetB64Index((char)B3(ulTmp)) < < 2 > > 2) & 0xFF;
*pbuf++ = b2;
len ++;
}

}

*pbuf = '\0 ';

return len;
}

#endif // #ifndef _BASE64_INCLUDE__H__
[解决办法]
////////////////////////////////////////////////////////////
// base64.h

//************************************************************************/
// base64编码表
//
//0 A 17 R 34 i 51 z
//1 B 18 S 35 j 52 0
//2 C 19 T 36 k 53 1
//3 D 20 U 37 l 54 2
//4 E 21 V 38 m 55 3
//5 F 22 W 39 n 56 4
//6 G 23 X 40 o 57 5
//7 H 24 Y 41 p 58 6
//8 I 25 Z 42 q 59 7
//9 J 26 a 43 r 60 8
//10 K 27 b 44 s 61 9
//11 L 28 c 45 t 62 +
//12 M 29 d 46 u 63 /
//13 N 30 e 47 v (pad) =
//14 O 31 f 48 w
//15 P 32 g 49 x
//16 Q 33 h 50 y
//
// base64编码步骤:
//
//原文:
//
//你好
//C4 E3 BA C3
//11000100 11100011 10111010 11000011
//00110001 00001110 00001110 00111010
//49 14(十进制)


//x O O 6字符
//01111000 01001111 01001111 00110110
//78(十六进制)
//xOO6
//
//解码:
//xOO6
//78 4f 4f 36
//01111000 01001111 01001111 00110110
//49 14
//00110001 00001110 00001110 00111010 31 0e 0e 3a
//
//11000100 11100011 10111010
//C4 E3 BA
//

#ifndef _BASE64_INCLUDE__H__
#define _BASE64_INCLUDE__H__

// 编码后的长度一般比原文多占1/3的存储空间,请保证base64code有足够的空间
inline int Base64Encode(char * base64code, const char * src, int src_len = 0);
inline int Base64Decode(char * buf, const char * base64code, int src_len = 0);

__inline char GetB64Char(int index)
{
const char szBase64Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ ";
if (index > = 0 && index < 64)
return szBase64Table[index];

return '= ';
}

// 从双字中取单字节
#define B0(a) (a & 0xFF)
#define B1(a) (a > > 8 & 0xFF)
#define B2(a) (a > > 16 & 0xFF)
#define B3(a) (a > > 24 & 0xFF)

// 编码后的长度一般比原文多占1/3的存储空间,请保证base64code有足够的空间
inline int Base64Encode(char * base64code, const char * src, int src_len)
{
if (src_len == 0)
src_len = strlen(src);

int len = 0;
unsigned char* psrc = (unsigned char*)src;
char * p64 = base64code;
for (int i = 0; i < src_len - 3; i += 3)
{
unsigned long ulTmp = *(unsigned long*)psrc;
register int b0 = GetB64Char((B0(ulTmp) > > 2) & 0x3F);
register int b1 = GetB64Char((B0(ulTmp) < < 6 > > 2 | B1(ulTmp) > > 4) & 0x3F);
register int b2 = GetB64Char((B1(ulTmp) < < 4 > > 2 | B2(ulTmp) > > 6) & 0x3F);
register int b3 = GetB64Char((B2(ulTmp) < < 2 > > 2) & 0x3F);
*((unsigned long*)p64) = b0 | b1 < < 8 | b2 < < 16 | b3 < < 24;
len += 4;
p64 += 4;
psrc += 3;
}

// 处理最后余下的不足3字节的饿数据
if (i < src_len)
{
int rest = src_len - i;
unsigned long ulTmp = 0;
for (int j = 0; j < rest; ++j)
{
*(((unsigned char*)&ulTmp) + j) = *psrc++;
}

p64[0] = GetB64Char((B0(ulTmp) > > 2) & 0x3F);
p64[1] = GetB64Char((B0(ulTmp) < < 6 > > 2 | B1(ulTmp) > > 4) & 0x3F);
p64[2] = rest > 1 ? GetB64Char((B1(ulTmp) < < 4 > > 2 | B2(ulTmp) > > 6) & 0x3F) : '= ';
p64[3] = rest > 2 ? GetB64Char((B2(ulTmp) < < 2 > > 2) & 0x3F) : '= ';
p64 += 4;
len += 4;
}

*p64 = '\0 ';

return len;
}


__inline int GetB64Index(char ch)
{
int index = -1;
if (ch > = 'A ' && ch <= 'Z ')
{
index = ch - 'A ';
}
else if (ch > = 'a ' && ch <= 'z ')
{
index = ch - 'a ' + 26;
}
else if (ch > = '0 ' && ch <= '9 ')
{
index = ch - '0 ' + 52;
}
else if (ch == '+ ')
{
index = 62;
}
else if (ch == '/ ')
{
index = 63;
}

return index;
}

// 解码后的长度一般比原文少用占1/4的存储空间,请保证buf有足够的空间
inline int Base64Decode(char * buf, const char * base64code, int src_len)
{
if (src_len == 0)
src_len = strlen(base64code);

int len = 0;
unsigned char* psrc = (unsigned char*)base64code;
char * pbuf = buf;


for (int i = 0; i < src_len - 4; i += 4)
{
unsigned long ulTmp = *(unsigned long*)psrc;

register int b0 = (GetB64Index((char)B0(ulTmp)) < < 2 | GetB64Index((char)B1(ulTmp)) < < 2 > > 6) & 0xFF;
register int b1 = (GetB64Index((char)B1(ulTmp)) < < 4 | GetB64Index((char)B2(ulTmp)) < < 2 > > 4) & 0xFF;
register int b2 = (GetB64Index((char)B2(ulTmp)) < < 6 | GetB64Index((char)B3(ulTmp)) < < 2 > > 2) & 0xFF;

*((unsigned long*)pbuf) = b0 | b1 < < 8 | b2 < < 16;
psrc += 4;
pbuf += 3;
len += 3;
}

// 处理最后余下的不足4字节的饿数据
if (i < src_len)
{
int rest = src_len - i;
unsigned long ulTmp = 0;
for (int j = 0; j < rest; ++j)
{
*(((unsigned char*)&ulTmp) + j) = *psrc++;
}

register int b0 = (GetB64Index((char)B0(ulTmp)) < < 2 | GetB64Index((char)B1(ulTmp)) < < 2 > > 6) & 0xFF;
*pbuf++ = b0;
len ++;

if ( '= ' != B1(ulTmp) && '= ' != B2(ulTmp))
{
register int b1 = (GetB64Index((char)B1(ulTmp)) < < 4 | GetB64Index((char)B2(ulTmp)) < < 2 > > 4) & 0xFF;
*pbuf++ = b1;
len ++;
}

if ( '= ' != B2(ulTmp) && '= ' != B3(ulTmp))
{
register int b2 = (GetB64Index((char)B2(ulTmp)) < < 6 | GetB64Index((char)B3(ulTmp)) < < 2 > > 2) & 0xFF;
*pbuf++ = b2;
len ++;
}

}

*pbuf = '\0 ';

return len;
}

#endif // #ifndef _BASE64_INCLUDE__H__

上面那位发的是BCB的,找到一个VC的,发上来

热点排行