Base64.cpp
上传用户:weimei12
上传日期:2022-08-11
资源大小:185k
文件大小:4k
源码类别:

Email客户端

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MIMECode.h"
  3. #include "Base64.h"
  4. #ifdef _DEBUG
  5. #undef THIS_FILE
  6. static char THIS_FILE[]=__FILE__;
  7. #define new DEBUG_NEW
  8. #endif
  9. //////////////////////////////////////////////////////////////////////
  10. // Construction/Destruction
  11. //////////////////////////////////////////////////////////////////////
  12. CBase64::CBase64()
  13. {
  14. char arr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  15. for( int i = 0; i < 64; i ++ )
  16. {
  17. m_Arr[i] = arr[i];
  18. m_Map.SetAt(arr[i], i); 
  19. }
  20. }
  21. CBase64::~CBase64()
  22. {
  23. }
  24. CString CBase64::Encode(LPCTSTR szEncoding, int nSize)
  25. {
  26. int nOutlen = 0;
  27. nOutlen = (nSize / 3 * 4) + (nSize % 3 ? 4 : 0);
  28. char * pOutbuf = NULL;
  29. pOutbuf = new char [nOutlen + 1];
  30. if (NULL == pOutbuf)
  31. {
  32. return "";
  33. }
  34. pOutbuf[nOutlen] = '';
  35. char * p = pOutbuf;//used as cursor
  36. int i = 0;
  37. for(; i < nSize / 3; i++)
  38. {
  39. EncodeEvery3Byte(szEncoding + i * 3, p);
  40. p = p + 4;
  41. }
  42. if(nSize % 3)
  43. {
  44. EncodeEvery3Byte(szEncoding + i * 3, p, nSize % 3);
  45. }
  46. CString strOut(pOutbuf);
  47. delete []pOutbuf;
  48. return strOut;
  49. }
  50. CString CBase64:: Decode(LPCTSTR szDecoding)
  51. {
  52. int nSrclen = 0;
  53. nSrclen = (int)strlen(szDecoding);
  54. int nOutlen = 0;
  55. nOutlen = (nSrclen / 4 * 3);//this len now may be bigger, becuase '=' is not ture code
  56. char* szOutput = NULL;
  57. szOutput = new char [nOutlen + 1];
  58. if (NULL == szOutput)
  59. {
  60. return "";
  61. }
  62. memset(szOutput, '', nOutlen + 1);
  63. char * p = szOutput;//use as cursor
  64. int i = 0;
  65. for(; i < nSrclen / 4; i++ )
  66. {
  67. DecodeEvery4Byte(szDecoding + i * 4, p);
  68. p = p + 3;
  69. }
  70. //process the "=" if there are any
  71. i = 0;
  72. for(int k = nSrclen-1; szDecoding[k] == '='; k--)
  73. {
  74. i++;
  75. }
  76. nOutlen = nOutlen - i;
  77. CString strOutput(szOutput);
  78. delete szOutput;
  79. return strOutput;
  80. }
  81. ///<summary>
  82. ///   Encode the buffer 3 byte one time
  83. ///</summary>
  84. void CBase64::EncodeEvery3Byte(LPCTSTR szInBuf, LPTSTR szOutBuf, int nRest /*= 0*/)
  85. {
  86. ASSERT(nRest >= 0 && nRest <= 2);
  87. if(!nRest)
  88. {//the part that is the multiple of three
  89. int i = 0;
  90. for(; i < 4; i ++)
  91. {
  92. * (szOutBuf ++) = m_Arr[Get6Bits(szInBuf, i)];
  93. }
  94. }
  95. else
  96. {//the remainder
  97. memset(szOutBuf, '=', 4);
  98. char cccc[4];
  99. memset(cccc, 0x00, 4);
  100. memcpy(cccc, szInBuf, nRest);
  101. szOutBuf[0] = m_Arr[Get6Bits(cccc, 0)];
  102. szOutBuf[1] = m_Arr[Get6Bits(cccc, 1)];
  103. if(nRest == 2)
  104. {//some bits remain in this byte
  105. szOutBuf[2] = m_Arr[Get6Bits(cccc, 2)];
  106. }
  107. }
  108. }
  109. ///<summary>
  110. ///   Get 6 bits from the origin string
  111. ///</summary>
  112. char CBase64::Get6Bits(LPCTSTR szInBase, int nOffset)
  113. {
  114. ASSERT(nOffset >= 0 && nOffset <= 3);
  115. unsigned char c = 0x00;
  116. unsigned char temp = 0;
  117. if(0 == nOffset)
  118. {
  119. c = szInBase[0] & MakeBitSection(0, 5);
  120. c = c >> 2;
  121. }
  122. else if(1 == nOffset)
  123. {
  124. c = (szInBase[0] & MakeBitSection(6, 7)) << 4;
  125. temp = szInBase[1] & MakeBitSection(0, 3);
  126. c |= temp >> 4;
  127. }
  128. else if(2 == nOffset)
  129. {
  130. c = (szInBase[1] & MakeBitSection(4, 7)) << 2;
  131. temp = (szInBase[2] & MakeBitSection(0, 1));
  132. c |= temp >> 6;
  133. }
  134. else if(3 == nOffset)
  135. {
  136. c = szInBase[2] & MakeBitSection(2, 7);
  137. }
  138. return c;
  139. }
  140. ///<summary>
  141. ///   decode the string 4 byte one time
  142. ///</summary>
  143. void CBase64::DecodeEvery4Byte(LPCTSTR szInBuf, LPTSTR szOutBuf)
  144. {
  145. char b6 = 0;
  146. int i =  0;
  147. for(; i < 4; i ++)
  148. {
  149. if(!m_Map.Lookup(szInBuf[i], b6))
  150. {
  151. b6 = 0x00;
  152. }
  153. Set6Bits(i, b6, szOutBuf);
  154. }
  155. }
  156. ///<summary>
  157. ///   Set 6 bits to the destination string
  158. ///</summary>
  159. void CBase64::Set6Bits(int nOffset, char n6Bits, LPTSTR szOutBuf)
  160. {
  161. ASSERT(nOffset >= 0 && nOffset <= 3);
  162. unsigned char temp = 0;
  163. if(0 == nOffset)
  164. {
  165. n6Bits = n6Bits << 2;
  166. szOutBuf[0] |= n6Bits;
  167. }
  168. else if(1 == nOffset)
  169. {
  170. n6Bits = n6Bits << 2;
  171. temp = (n6Bits & MakeBitSection(0, 1));
  172. szOutBuf[0] |= temp >> 6;
  173. szOutBuf[1] |= (n6Bits & MakeBitSection(2, 5)) << 2;
  174. }
  175. else if(2 == nOffset)
  176. {
  177. n6Bits = n6Bits << 2;
  178. temp = (n6Bits & MakeBitSection(0, 3));
  179. szOutBuf[1] |= temp >> 4;
  180. szOutBuf[2] |= (n6Bits & MakeBitSection(4, 5)) << 4;
  181. }
  182. else if(3 == nOffset)
  183. {
  184. szOutBuf[2] |= n6Bits;
  185. }
  186. }