wchar_t* buf 来存储汉字;
怎么将其进行base64编码

解决方案 »

  1.   

    网上找个base64转换的代码对目标字符buffer执行一下就可以了
      

  2.   

    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;
    }
      

  3.   

    我将函数入参由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;
    }