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: }