stdafx.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. // stdafx.cpp : 只包括标准包含文件的源文件
  2. // MD5Test.pch 将作为预编译头
  3. // stdafx.obj 将包含预编译类型信息
  4. #include "stdafx.h"
  5. // TODO: 在 STDAFX.H 中
  6. // 引用任何所需的附加头文件,而不是在此文件中引用
  7. WCHAR* ASCII2UNICODE(IN LPCCH lpASCIIStr)
  8. {
  9. if ( lpASCIIStr == NULL )
  10. return NULL;
  11. // 获取宽字符字节数;
  12. int cchWideChar = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
  13. if ( cchWideChar == 0)
  14. return NULL;
  15. // 转换成宽字符串;
  16. WCHAR *pWideChar = new WCHAR[cchWideChar + 1];
  17. memset(pWideChar, 0 , sizeof(WCHAR)*(cchWideChar + 1));
  18. int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pWideChar, cchWideChar );
  19. if ( nWriteNum != cchWideChar)
  20. {
  21. if (pWideChar)
  22. delete []pWideChar;
  23. return NULL;
  24. }
  25. return pWideChar;
  26. }
  27. BOOL ASCII2UNICODE(IN LPCCH lpASCIIStr, OUT PWCH pUNICODEStr, IN CONST INT& nUNICODEStrLen)
  28. {
  29. if ( lpASCIIStr == NULL )
  30. return FALSE;
  31. // 获取宽字符字节数;
  32. int cchWideChar = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
  33. if ( cchWideChar == 0 || cchWideChar >= nUNICODEStrLen)
  34. return FALSE;
  35. // 转换成宽字符串;
  36. memset(pUNICODEStr, 0 , sizeof(WCHAR)*nUNICODEStrLen);
  37. int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pUNICODEStr, cchWideChar );
  38. if ( nWriteNum != cchWideChar)
  39. return FALSE;
  40. return TRUE;
  41. }
  42. CHAR* UNICODE2ASCII(IN LPWCH lpUNICODEStr)
  43. {
  44. if ( lpUNICODEStr == NULL )
  45. return NULL;
  46. // 获取多字节字符字节数;
  47. int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  48. if ( cbMultiByte == 0 )
  49. return NULL;
  50. // 转换成多字节字符;
  51. CHAR *pMultiByteStr = new CHAR[cbMultiByte+1];
  52. memset(pMultiByteStr, 0, cbMultiByte + 1);
  53. int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
  54. if (nWriteNum != cbMultiByte)
  55. {
  56. if (pMultiByteStr)
  57. delete []pMultiByteStr;
  58. return NULL;
  59. }
  60. return pMultiByteStr;
  61. }
  62. BOOL UNICODE2ASCII(IN LPWCH lpUNICODEStr, OUT LPCH pASCIIStr, IN CONST INT& nASCIIStrLen)
  63. {
  64. if ( lpUNICODEStr == NULL )
  65. return FALSE;
  66. // 获取多字节字符字节数;
  67. int cbMultiByte = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  68. if ( cbMultiByte == 0 || cbMultiByte >= nASCIIStrLen )
  69. return FALSE;
  70. // 转换成多字节字符;
  71. memset((void*)pASCIIStr, 0, nASCIIStrLen);
  72. int nWriteNum = WideCharToMultiByte(CP_OEMCP, 0, lpUNICODEStr, -1, pASCIIStr, cbMultiByte, NULL, NULL);
  73. if (nWriteNum != cbMultiByte)
  74. {
  75. return FALSE;
  76. }
  77. return TRUE;
  78. }
  79. CHAR* UNICODE2UTF8(IN LPWCH lpUNICODEStr)
  80. {
  81. if ( lpUNICODEStr == NULL )
  82. return NULL;
  83. // 获取多字节字符字节数;
  84. int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  85. if ( cbMultiByte == 0 )
  86. return NULL;
  87. // 转换成多字节字符;
  88. CHAR* pMultiByteStr = new CHAR[cbMultiByte+1];
  89. memset(pMultiByteStr, 0, cbMultiByte + 1);
  90. int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pMultiByteStr, cbMultiByte, NULL, NULL);
  91. if (nWriteNum != cbMultiByte)
  92. {
  93. if (pMultiByteStr)
  94. delete []pMultiByteStr;
  95. return NULL;
  96. }
  97. return pMultiByteStr;
  98. }
  99. BOOL UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen)
  100. {
  101. if ( lpUNICODEStr == NULL )
  102. return FALSE;
  103. // 获取多字节字符字节数;
  104. int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  105. if ( cbMultiByte == 0 || cbMultiByte >= nUTF8StrLen )
  106. return FALSE;
  107. // 转换成多字节字符;
  108. memset(pUTF8Str, 0, nUTF8StrLen);
  109. int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pUTF8Str, cbMultiByte, NULL, NULL);
  110. if (nWriteNum != cbMultiByte)
  111. {
  112. return FALSE;
  113. }
  114. return TRUE;
  115. }
  116. CHAR* ASCII2UTF8(IN LPCCH lpASCIIStr)
  117. {
  118. // 将ASCII字符串转成UNICODE字符串;
  119. WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
  120. if ( pWideChar == NULL )
  121. return NULL;
  122. // 再将UICODE转成UTF8;
  123. CHAR* pUTF8 = UNICODE2UTF8(pWideChar);
  124. if ( pWideChar )
  125. delete []pWideChar;
  126. return pUTF8;
  127. }
  128. BOOL ASCII2UTF8(IN LPCCH lpASCIIStr, OUT LPCH pUTF8Str, IN CONST INT& nUTF8StrLen)
  129. {
  130. // 将ASCII字符串转成UNICODE字符串;
  131. WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
  132. if ( pWideChar == NULL )
  133. return FALSE;
  134. // 再将UICODE转成UTF8;
  135. BOOL bResult = UNICODE2UTF8(pWideChar, pUTF8Str, nUTF8StrLen);
  136. if ( pWideChar )
  137. delete []pWideChar;
  138. return bResult;
  139. }
  140. WORD AsciiToBYTE(BYTE btSrc)
  141. {
  142. WORD chDest = (WORD)btSrc;
  143. if ((btSrc >= 'A')&&(btSrc <= 'F'))
  144. {
  145. chDest = chDest - 'A' + 10;
  146. }
  147. else if ((btSrc >= 'a')&&(btSrc <= 'f'))
  148. {
  149. chDest = chDest - 'a' + 10;
  150. }
  151. else if ((btSrc >= '0')&&(btSrc <= '9'))
  152. {
  153. chDest -= '0';
  154. }
  155. return chDest;
  156. }
  157. void ByteToTwoByte( unsigned char *szMsg, int nCount, unsigned char *szConvMsg )
  158. {
  159. char ch[3];
  160. unsigned char lh[2];
  161. for (int i = 0; i < nCount; i++)
  162. {
  163. lh[0] = szMsg[i] >> 4;
  164. lh[1] = szMsg[i] & 0x0f;
  165. for ( int j = 0; j < 2; j++ )
  166. {
  167. if ( lh[j] <= 9 )
  168. szConvMsg[i*2 + j] = lh[j] + '0';
  169. else
  170. {
  171. switch ( lh[j] )
  172. {
  173. case 10:
  174. szConvMsg[i*2 + j] = 'a';
  175. break;
  176. case 11:
  177. szConvMsg[i*2 + j] = 'b';
  178. break;
  179. case 12:
  180. szConvMsg[i*2 + j] = 'c';
  181. break;
  182. case 13:
  183. szConvMsg[i*2 + j] = 'd';
  184. break;
  185. case 14:
  186. szConvMsg[i*2 + j] = 'e';
  187. break;
  188. case 15:
  189. szConvMsg[i*2 + j] = 'f';
  190. break;
  191. default:
  192. break;
  193. }
  194. }
  195. }
  196. }
  197. }
  198. // 1个字节转成2个十六进制字符;
  199. void ByteTurn2HexChar( unsigned char by, char (&szHex)[3] )
  200. {
  201. unsigned char lh[2];
  202. lh[0] = by >> 4;
  203. lh[1] = by & 0x0f;
  204. for ( int i = 0; i < 2; i++ )
  205. {
  206. if ( lh[i] <= 9 )
  207. szHex[i] = lh[i] + '0';
  208. else
  209. {
  210. switch ( lh[i] )
  211. {
  212. case 10:
  213. szHex[i] = 'a';
  214. break;
  215. case 11:
  216. szHex[i] = 'b';
  217. break;
  218. case 12:
  219. szHex[i] = 'c';
  220. break;
  221. case 13:
  222. szHex[i] = 'd';
  223. break;
  224. case 14:
  225. szHex[i] = 'e';
  226. break;
  227. case 15:
  228. szHex[i] = 'f';
  229. break;
  230. default:
  231. break;
  232. }
  233. }
  234. }
  235. }
  236. char Hex16(char WillChangeNum[]) //该函数把四位二进制转换成十六进制数;
  237. {
  238. int i;
  239. i = (WillChangeNum[3]) + (WillChangeNum[2] * 10) + (WillChangeNum[1] * 100) + (WillChangeNum[0] * 1000);
  240. switch(i)
  241. {
  242. case 0:
  243. return 0;
  244. case 1:
  245. return 1;
  246. case 10:
  247. return 2;
  248. case 11:
  249. return 3;
  250. case 100:
  251. return 4;
  252. case 101:
  253. return 5;
  254. case 110:
  255. return 6;
  256. case 111:
  257. return 7;
  258. case 1000:
  259. return 8;
  260. case 1001:
  261. return 9;
  262. case 1010:
  263. return 0x0A;
  264. case 1011:
  265. return 0x0B;
  266. case 1100:
  267. return 0x0C;
  268. case 1101:
  269. return 0x0D;
  270. case 1110:
  271. return 0x0E;
  272. case 1111:
  273. return 0x0F;
  274. }
  275. return -1;
  276. }