이걸루 해봤는데..디코딩이 잘 안되네요...
전 아웃룩 dbx 화일에 들어 있는것을 가져와서 body 만 디코딩을 해야 해서 그렇습니다...
혹시 다른건 없으신지...
방태윤 님이 쓰신 글 :
:
http://www.delphi.co.kr/cgi-bin/cwb/CrazyWWWBoard.cgi?mode=read&num=47&db=cbtip&backdepth=1
: Black}{ole 이라는 분이 올린것입니다.
:
: Base64 인코딩/디코딩
:
: //Base64Table contains the 64 printable characters
: const char Base64Table[64]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
: int Base64Encod(const char *buftoenc,int bufsize,char *encbuf)
: {
: int i=0;
: int b64byte[5];
: unsigned char *buftemp;
:
: //Allocate space for the temporary string
: buftemp=(unsigned char *)malloc(bufsize+2);
: strcpy(buftemp,buftoenc);
: if (fmod(bufsize,3)==1)
: {
: buftemp[bufsize]='\0';
: buftemp[bufsize+1]='\0';
: }
: if (fmod(bufsize,3)==2)buftemp[bufsize]='\0';
: while (i<bufsize)
: {
: b64byte[0]=buftemp[i]>>2;
: b64byte[1]=((buftemp[i]&3)<<4)|(buftemp[i+1]>>4);
: b64byte[2]=((buftemp[i+1]&0x0F)<<2)|(buftemp[i+2]>>6);
: b64byte[3]=buftemp[i+2]&0x3F;
: encbuf[i+(i/3)]=Base64Table[b64byte[0]];
: encbuf[i+(i/3)+1]=Base64Table[b64byte[1]];
: encbuf[i+(i/3)+2]=Base64Table[b64byte[2]];
: encbuf[i+(i/3)+3]=Base64Table[b64byte[3]];
: i+=3;
: }
: free(buftemp);
: if (fmod(bufsize,3)==0)return bufsize*8/6;
: if (fmod(bufsize,3)==1)return((bufsize+2)*8/6)-2;
: if (fmod(bufsize,3)==2)return((bufsize+1)*8/6)-1;
: return -1;
: }
:
:
:
:
: Base64 Decoding Décodage Base64
:
:
:
:
: Decodes the string buftodec in base64 format. You have to pass to the function the size of the string and a pointer to the string where to put the decoded one. This function returns the number of characters contained in the decoded string.
: Cette fonction décode un string codé en base64. Passez à la fonction le string à décoder et sa taille ainsi qu'un pointeur vers le string destiné à contenir le string décodé. La fonction retourne le nombre de caractères contenu dans le string décodé.
:
: //Base64Table contains the 64 printable characters
: const char Base64Table[64]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
: int Base64Decod(const char *buftodec,int bufsize,char *decbuf)
: {
: int i=0;
: unsigned char binbyte[4];
: int cpos[5];
: unsigned char *buftemp;
:
:
:
: //Allocate space for the temporary string
: buftemp=(unsigned char *)malloc(bufsize);
: strcpy(buftemp,buftodec);
: if (fmod(bufsize,4)==1)
: {
: buftemp[bufsize]='\0';
: buftemp[bufsize+1]='\0';
: buftemp[bufsize+2]='\0';
: }
: if (fmod(bufsize,4)==2)
: {
: buftemp[bufsize]='\0';
: buftemp[bufsize+1]='\0';
: }
: if (fmod(bufsize,4)==3)buftemp[bufsize]='\0';
: while (i<bufsize)
: {
: cpos[0]=strchr(Base64Table,buftemp[i])-Base64Table;
: cpos[1]=strchr(Base64Table,buftemp[i+1])-Base64Table;
: cpos[2]=strchr(Base64Table,buftemp[i+2])-Base64Table;
: cpos[3]=strchr(Base64Table,buftemp[i+3])-Base64Table;
: binbyte[0]=((cpos[0]<<2)|(cpos[1]>>4));
: binbyte[1]=((cpos[1]<<4)|(cpos[2]>>2));
: binbyte[2]=(((cpos[2]&0x03)<<6)|(cpos[3]&0x3f));
: decbuf[i-(i/4)]=binbyte[0];
: decbuf[i-(i/4)+1]=binbyte[1];
: decbuf[i-(i/4)+2]=binbyte[2];
: i+=4;
: }
: free(buftemp);
: if (fmod(bufsize,4)==0)return bufsize*6/8;
: if (fmod(bufsize,4)==1)return((bufsize+3)*6/8)-3;
: if (fmod(bufsize,4)==2)return((bufsize+2)*6/8)-2;
: if (fmod(bufsize,4)==3)return((bufsize+1)*6/8)-1;
: return -1;
: }
:
:
:
:
: 매댐덜 님이 쓰신 글 :
: : VC++ 밖엔 없는데...제 실력으론 포팅이 안되네요...
: :
: : 소스 올려 드리면 포팅을 좀 해주실수 있는지..흑흑 급한건데..여기서 막히네요...
: :
: :
: : void CEmailChecker::Base64Decoding(CString &strSource)
: : {
: : LPSTR szDecode;
: : char szTemp[10];
: : CString strDecode = "", strTemp;
: : int i, j, nSize, nPadding, nSum, test;
: : int *pData;
: :
: : m_strDecoded = "";
: : strSource.Remove('=');
: : szDecode = (LPSTR)(LPCTSTR)strSource;
: : nSize = strSource.GetLength();
: :
: : pData = new int[nSize];
: :
: : // 문자열에서 6비트씩 추출
: : for(i = 0 ; i < nSize ; i++)
: : {
: : if(szDecode[i] >= 'A' && szDecode[i] <= 'Z')
: : pData[i] = szDecode[i] - 'A';
: : else if(szDecode[i] >= 'a' && szDecode[i] <= 'z')
: : pData[i] = szDecode[i] - 'a' + 26;
: : else if(szDecode[i] >= '0' && szDecode[i] <= '9')
: : pData[i] = szDecode[i] - '0' + 52;
: : else if(szDecode[i] == '+')
: : pData[i] = 62;
: : else if(szDecode[i] == '/')
: : pData[i] = 63;
: :
: : // 이 부분이 6비트로 나와야 함...
: : itoa(pData[i], szTemp, 2);
: : nPadding = 6 - strlen(szTemp);
: : for(j = 0 ; j < nPadding ; j++)
: : strDecode += '0';
: :
: : strDecode += szTemp;
: : }
: :
: : // 6비트씩으로 맞추면서 들어간 '0'패딩부분을 없애줌
: : nSize = strDecode.GetLength();
: : nPadding = nSize % 8;
: : if(nPadding > 0)
: : {
: : strTemp = strDecode.Left(nSize-nPadding);
: : nSize = strTemp.GetLength();
: : }
: : else
: : strTemp = strDecode;
: :
: : // 다시 8비트씩으로 묶음
: : nSize /= 8;
: :
: : for(j = 0 ; j < nSize ; j++)
: : {
: : strDecode = strTemp.Left(8);
: : szDecode = (LPSTR)(LPCTSTR)strDecode;
: :
: : for(nSum = 0, i = 0 ; i < 8 ; i++)
: : {
: : if(szDecode[i] == '0')
: : continue;
: : nSum += (int)pow(2, 7-i);
: : }
: : m_strDecoded += (char)nSum;
: : test = strTemp.GetLength();
: : strTemp = strTemp.Right(test-8);
: : }
: :
: : delete [] pData;
: : }
: :
: : /*******************************************************************************
: : KS C 5601 에서 Quoted-printable로 인코딩된 것을 디코딩하는 함수
: : *******************************************************************************/
: : void CEmailChecker::QPDecoding(CString &strSource)
: : {
: : LPSTR szDecode;
: : CString strDecode = "", strTemp;
: : int i, nSize, nSum, nCount = 0, nValue;
: :
: : m_strDecoded = "";
: : strSource.Remove('=');
: : szDecode = (LPSTR)(LPCTSTR)strSource;
: : nSize = strSource.GetLength();
: :
: : for(nSum = 0, i = 0 ; i < nSize ; i++)
: : {
: : if(szDecode[i] >= '0' && szDecode[i] <= '9')
: : nValue = (int)(szDecode[i] - '0');
: : else if(szDecode[i] >= 'A' && szDecode[i] <= 'F')
: : nValue = (int)(szDecode[i] - 'A') + 10;
: : else
: : {
: : m_strDecoded += szDecode[i];
: : continue;
: : }
: : if(nCount == 0)
: : {
: : nSum += nValue * 16;
: : nCount++;
: : continue;
: : }
: : else if(nCount == 1)
: : {
: : nSum += nValue;
: : nCount = 0;
: : m_strDecoded += (char)nSum;
: : nSum = 0;
: : }
: : }
: : }
: :