String.cpp
上传用户:hbzxgg2
上传日期:2009-03-28
资源大小:291k
文件大小:4k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "String.h"
  3. CString Data2HexString ( char *data, int size, int nBytesPerLine/*=16*/ )
  4. {
  5. CString csHexString, csTemp;
  6. for ( int i=0; i<size; i++ )
  7. {
  8. csTemp.Format ( L"%02X ", (BYTE)data[i] );
  9. csHexString += csTemp;
  10. if ( (i+1) % nBytesPerLine == 0 )
  11. csHexString += "rn";
  12. }
  13. return csHexString;
  14. }
  15. BYTE HexCharToData(TCHAR cChar)
  16. {
  17. if ( cChar >= _T('0') && cChar <= _T('9') )
  18. return (BYTE)(cChar-_T('0'));
  19. if ( cChar >= _T('a') && cChar <= _T('f') )
  20. return (BYTE)(cChar-_T('a')+0x0a);
  21. if ( cChar >= _T('A') && cChar <= _T('F') )
  22. return (BYTE)(cChar-_T('A')+0x0A);
  23. return 0xff;
  24. }
  25. //
  26. // 将一个16进制的字符串转换为16进制的数,返回数据长度
  27. // 例如:将字符串“61 62 63 64 65 66 67 68”转换成数据 [0x61 0x62 0x63 0x64 0x65 0x66 0x67 0x68]
  28. // 保存到 szOutBuffer 缓冲中
  29. //
  30. int ConvStringToHexData(CString csOrgStr, BYTE *szOutBuffer, int nOutBufferSize)
  31. {
  32. ASSERT ( szOutBuffer && nOutBufferSize > 0 );
  33. // 先得到有效的16进制字符串,同时将表示16进制的标志“0x”去掉
  34. CString csLegalHexStr;
  35. csOrgStr.MakeLower();
  36. csOrgStr.Replace ( _T("0x"), _T("") );
  37. for ( int i=0; i<csOrgStr.GetLength(); i++ )
  38. {
  39. TCHAR c = csOrgStr.GetAt (i);
  40. if ( (c>=_T('0')&&c<=_T('9')) || (c>=_T('a') && c<= _T('f')) )
  41. {
  42. csLegalHexStr += c;
  43. }
  44. }
  45. if ( csLegalHexStr.GetLength() < 1 ) return 0;
  46. // 不是偶数个字符则在后面补“0”
  47. if ( (csLegalHexStr.GetLength() % 2) != 0 )
  48. csLegalHexStr += _T("0");
  49. int j=0;
  50. for ( int i=0; j<nOutBufferSize && i<csLegalHexStr.GetLength(); i+= 2 )
  51. {
  52. BYTE btData = 0;
  53. BYTE bLo = ( 0x0f & HexCharToData ( csLegalHexStr.GetAt(i+1) ) );
  54. BYTE bHi = ( 0x0f & HexCharToData ( csLegalHexStr.GetAt(i) ) );
  55. if ( bLo == 0xff || bHi == 0xff )
  56. return -1;
  57. btData = ( bHi << 4 ) | bLo;
  58. szOutBuffer[j++] = btData;
  59. }
  60. return j;
  61. }
  62. //
  63. // 将 lpszOrg 转换为多字节表示的字符串
  64. //
  65. int GetMltiByteChar ( LPCTSTR lpszOrg, OUT char *buf, int size )
  66. {
  67. if ( !lpszOrg || !buf || size<1 ) return -1;
  68. #ifdef UNICODE
  69. return WideCharToMultiByte ( CP_ACP, 0, lpszOrg, (int)strlen_s(lpszOrg), (LPSTR)buf, size, NULL, NULL );
  70. #else
  71. strncpy_s ( buf, lpszOrg, size-1 );
  72. return strlen_s(buf);
  73. #endif
  74. }
  75. //
  76. // 将 lpszOrg 转换为该程序使用的编码字符串,如果该程序是 UNICODE 就转为 UNICODE,如果是 ANSI 就转为 ANSI 的
  77. //
  78. CString GetCompatibleString ( LPCTSTR lpszOrg, BOOL bOrgIsUncode )
  79. {
  80. if ( !lpszOrg ) return L"";
  81. #ifdef UNICODE
  82. if ( bOrgIsUncode ) return lpszOrg;
  83. int nOrgLen = strlen((const char*)lpszOrg);
  84. int nWideCount = nOrgLen + 1;
  85. WCHAR *wchar = new WCHAR[nWideCount];
  86. if ( !wchar ) return L"";
  87. memset ( wchar, 0, nWideCount*sizeof(WCHAR) );
  88. MultiByteToWideChar(CP_ACP, 0, (LPCSTR)lpszOrg, nOrgLen, wchar, nWideCount);
  89. CString csRet = wchar;
  90. delete[] wchar;
  91. return csRet;
  92. #else
  93. if ( !bOrgIsUncode ) return lpszOrg;
  94. int nOrgLen = wcslen(lpszOrg);
  95. int nMultiByteSize = nOrgLen / 2 + 2;
  96. CString csRet
  97. GetMltiByteChar ( lpszOrg, csRet.GetBuffer(nMultiByteSize), nMultiByteSize );
  98. csRet.ReleaseBuffer();
  99. return csRet;
  100. #endif
  101. }
  102. int hwSnprintf ( LPTSTR buffer, int count, LPCTSTR format, ... )
  103. {
  104. if ( count < 1 ) return 0;
  105. ASSERT_ADDRESS ( buffer, count );
  106. memset ( buffer, 0, count );
  107. // 格式化
  108. va_list  va;
  109. va_start (va, format);
  110. #ifdef UNICODE
  111. int nRet = _vsnwprintf ( buffer, count, (const wchar_t*)format, va);
  112. #else
  113. int nRet = _vsnprintf ( buffer, count, (const char*)format, va);
  114. #endif
  115. va_end(va);
  116. buffer [count-1] = _T('');
  117. int nLen = nRet;
  118. if ( nLen < 0 ) nLen = (int)strlen_s(buffer);
  119. if ( nLen > count ) nLen = count;
  120. return nLen;
  121. }