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

saliors 2005-11-25 09:22:11
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;
}

...全文
209 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
caplee 2006-06-10
  • 打赏
  • 举报
回复
mark
loves123 2006-03-28
  • 打赏
  • 举报
回复
不错,学习一下!
SqlDataAdapter 2006-03-15
  • 打赏
  • 举报
回复
mark
菜牛 2005-11-30
  • 打赏
  • 举报
回复
不知道strtol()的功能是不是符合要求。
nodefault 2005-11-30
  • 打赏
  • 举报
回复
恩,好东东!
jjkka 2005-11-25
  • 打赏
  • 举报
回复
那不如用汇编写吧,效率更高!
sxslyy 2005-11-25
  • 打赏
  • 举报
回复
支持一下,做串口程序,会用到的!
saliors 2005-11-25
  • 打赏
  • 举报
回复
没人感兴趣啊,哎,看来做硬件方面的人少了点。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧