转换16进制字符串为数值

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

posted on 2008-01-25 11:49 FongLuo 阅读(611) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

常用链接

留言簿

随笔分类(11)

随笔档案(79)

文章档案(1)

收藏夹(38)

学习网站

一般网站

最新随笔

搜索

积分与排名

最新评论

阅读排行榜