1: /*! 轉換16進制字符串為數值
2: \param [out] Value 輸出的數據。
3: \param [in] szHexStr 要轉換的字符串。
4: \param [in] stStrLen 字符串長度;默認為零,表示szHexStr以NULL結尾,最長為8+2。
5:
6: \retval bool - true:成功。
7: - false:失敗。
8:
9: \warning Value的類型只能是數值型的,并且是無符號。如DWORD, BYTE, etc.
10: \author FongLuo
11: \date 2008-01-25
12: */
13: template<typename VALUE_TYPE >
14: bool ConvertHexString(VALUE_TYPE &Value, LPCTSTR pcszHexStr, size_t stStrLen /*= 0*/)
15: {
16: ASSERT(pcszHexStr != NULL);
17:
18: if(stStrLen == 0)
19: stStrLen = _tcslen(pcszHexStr);
20:
21: if(stStrLen == 0)
22: return false;
23:
24: LPCSTR pStr = pcszHexStr;
25:
26: // 去掉開頭的0x字符
27: if ( (pcszHexStr[0] == _T('0'))
28: && (toupper(pcszHexStr[1]) == _T('X'))
29: )
30: {
31: if(stStrLen <= 2)
32: return false;
33:
34: pStr += 2;
35: stStrLen -= 2;
36: }
37:
38: // 限制轉換字符串的最大長度
39: stStrLen = min(sizeof(Value)*2, stStrLen);
40:
41: Value = 0;
42:
43: char ch = 0;
44: for(size_t sti = 0; sti<stStrLen; sti++, pStr++)
45: {
46: ch = *pStr;
47:
48: // 必須為16進制的字符
49: if(isxdigit(ch))
50: {
51: Value <<= 4;
52: // 轉為大寫
53: ch = toupper(ch);
54: if(isdigit(ch))
55: {
56: // '0' ~ '9' 的處理
57: Value |= (ch - _T('0'));
58: }
59: else
60: {
61: // 'A' ~ 'F' 的處理
62: Value |= (ch - _T('7'));
63: }
64: }
65: else
66: {
67: break;
68: }
69: }
70:
71: return true;
72: }