解决方案 »

  1.   

    查查msdn的Encoding Reference ATL一部分
      

  2.   

    Visualc++库-ATL Server Reference,也可用Base64Decode函数查找,我不是这方面的行家,只是知道有这些函数,你自己看吧。
      

  3.   

    int CBase64::Decode(char* base64, int len, char* orig, int size)
    {
    if(size < DecodeSize(len))
    return -1;
    int c;
    int i; //index of base64
    int j=0; //index of orig
    for(i=0; i<len; i++)
    {
    c=base64[i];
    if(c==cBASE64PAD)
    break;
    c=(int)strchr(szBase64Table, c);
    if(c==0)
    return -1;
    c-=(int)szBase64Table;
    switch(i & 0x03) //i%4
    {
    case 0:
    orig[j] = c << 2;
    break;
    case 1:
    orig[j++] |= c >> 4;
    orig[j] = (c & 0x0f) << 4;
    break;
    case 2:
    orig[j++] |= c >> 2;
    orig[j] = (c & 0x03) << 6;
    break;
    case 3:
    orig[j++] |= c;
    break;
    }
    }
    if(c == cBASE64PAD)
    {
    switch(i & 0x03) //i % 4
    {
    case 0:
    case 1:
    return -1;
    case 2:
    j++;
    case 3:
    // j++;
    break;
    }
    }
    return j;
    }
      

  4.   

    ??? 半截啊?#define cBASE64PAD '='char* CBase64::szBase64Table=
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz"
    "0123456789+/";int CBase64::Encode(char* orig, int len, char* base64, int size)
    {
    if(size < EncodeSize(len))
    return -1;
    char* current=orig;
    int i=0;
    while(len > 2)
    {
    base64[i++] = szBase64Table[current[0] >> 2];
    base64[i++] = szBase64Table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
    base64[i++] = szBase64Table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
    base64[i++] = szBase64Table[current[2] & 0x3f];
    current += 3;
    len -= 3;
    }
    if(len != 0)
    {
    base64[i++] = szBase64Table[current[0] >> 2];
    if (len > 1)
    {
    base64[i++] = szBase64Table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
    base64[i++] = szBase64Table[(current[1] & 0x0f) << 2];
    base64[i++] = cBASE64PAD;
    }
    else
    {
    base64[i++] = szBase64Table[(current[0] & 0x03) << 4];
    base64[i++] = cBASE64PAD;
    base64[i++] = cBASE64PAD;
    }
    }
    return i;
    }int CBase64::Decode(char* base64, int len, char* orig, int size)
    {
    if(size < DecodeSize(len))
    return -1;
    int c;
    int i; //index of base64
    int j=0; //index of orig
    for(i=0; i<len; i++)
    {
    c=base64[i];
    if(c==cBASE64PAD)
    break;
    c=(int)strchr(szBase64Table, c);
    if(c==0)
    return -1;
    c-=(int)szBase64Table;
    switch(i & 0x03) //i%4
    {
    case 0:
    orig[j] = c << 2;
    break;
    case 1:
    orig[j++] |= c >> 4;
    orig[j] = (c & 0x0f) << 4;
    break;
    case 2:
    orig[j++] |= c >> 2;
    orig[j] = (c & 0x03) << 6;
    break;
    case 3:
    orig[j++] |= c;
    break;
    }
    }
    if(c == cBASE64PAD)
    {
    switch(i & 0x03) //i % 4
    {
    case 0:
    case 1:
    return -1;
    case 2:
    j++;
    case 3:
    // j++;
    break;
    }
    }
    return j;
    }
      

  5.   

    谢谢上面这位老兄,不过你这好像只是Base64编码的编码,我需要的是通过截获的包信息(二进制码)恢复原始数据,然后对其内容进行过滤,是不是不同的编码还得进行不同的解码?
    例如,GB2312, ISO等,还得根据不同的编码解码吗?
    另外,除了关键字比较之外,还有没有什么办法能快速找到并恢复邮件的内容和附件信息?
      

  6.   

    base64编码一般是正文,附件等,你说的gb2312, iso是Quoted printable,那个简单,直接按十六进制转。
    最简单:当成.eml村起来,然后ShellExecute