16进制字符串转数值的程序,共享一下。

http://www.ggv.com.cn/forum/clib/string/strset.html              (有关字符串函数)

 

如何将字符转成的16进制再逆向转换成字符?
例如:
 
Char  mm[2]={‘A’,‘B’};输出16进制
for(int i =0;i<2;i++)
 {
    CString strmm;
strmm.Format("%02X",mm[i]);
//字符‘A’转成16进制41
}
strmm = “4142”
那么如何将strmm变成'AB'那
大虾们块帮忙了,期待。。。。
谁有算法共享一下,谢谢了
〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉〉--------------------------

int i,cnt = strmm.GetLength();
char ch;
char a;
for(i=0; i < cnt; i+=2)
{
ch = strmm.GetAt(i);
if(ch >= 'A' && ch <= 'F')
a = (ch - 'A') + 10;
else
a = ch-'0';
a *= 16;
ch = strmm.GetAt(i + 1);
if(ch >= 'A' && ch <= 'F')
a += (ch - 'A') + 10;
else
a += ch-'0';
}
每次循环结束,a就是你要的字符

)))))))))))))))))))))))))>>>>>>>>>>>>>>>>>>>>>>?????????????????????????

//下面的是一个人的,上面的是另一人的

VC里面没有相关的函数,近来要用,找了一下,有篇文章挺不错的,共享一下:

第一个版本,算是很常见的一个了。


long atox(char *s)
{
  long sum;

  assert(s);

  /* Skip whitespace */
  while (isspace(*s)) ++s;

  /* Do the conversion */
  for (sum = 0L; isxdigit(*s); ++s)
  {
    int digit;
    if (isdigit(*s))
      digit = *s - '0';
    else
      digit = toupper(*s) - 'A' + 10;
    sum = sum*16L + digit;
  }

  return sum;
}

第二个版本,比较有意思吧!

 

long atox(char *s)
{
  char xdigs[] = "0123456789ABCDEF";
  long sum;

  assert(s);

  /* Skip whitespace */
  while (isspace(*s)) ++s;

  /* Do the conversion */
  for (sum = 0L; isxdigit(*s); ++s)
  {
    int digit = strchr(xdigs,toupper(*s)) - xdigs;
    sum = sum*16L + digit;
  }

  return sum;
}

第三个和第四个基本差不多,都属于库函数的调用。

 

long atox(char *s)
{
  long n = 0L;
  sscanf(s,"%x",&n);
  return n;
}

 

long atox(char *s)
{
  return strtol(s,NULL,16);
}

总体上来说,我比较喜欢第二个。

网友 netex 看了后说:

第二个版本效率太低了。写个效率高的:

typedef unsigned int UINT;
typedef unsigned char UCHAR;

static UCHAR a2xtable[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};

UINT atox(const char* s)
{
UINT res = 0;
while (*s)
{
res = (res << 4) | a2xtable[*s++];
}
return res;
}

支持一下,做串口程序,会用到的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值