您的位置:首页 > 其它

字符串Ascll格式转16进制

2017-03-27 22:00 113 查看
之前做过一些项目需要用到ASCLL码转换到16进制,在网上搜索后发现,大部分都是10进制数字转16进制数据,这对于8位字符类型unsignal char

(这里不用char,因为char是-127到128,对于129-255之间的数溢出变为负数,算起来稍微麻烦 ,采用unsignal char是因为它的值在0到255)

来讲他可以接收最大为255的数字(从Ascll码左边可以看到数字),市面上的转换方式大多都是一个char对应一个数字比如0-F,这对于char说浪费4位没有使用而且超过’f’范围的解析不了;

下面贴上手动实现的代码:

函数定义如下:

int charToHex(char* dst,const unsigned char* src,int len);


代码实现如下:

//第一个参数表示输出转换字符串 空间大小大大于 src的2倍
//第2个参数表示输入字符串(ASCLL码)
//第3个参数表示需要转换字符串长度
int charToHex(char* dst,const unsigned char* src,int len)
{
if (0 == src)
{
return -1;
}
int nNum = 0;
const unsigned char*psrc = src;
for (int i = 0;i < len;i++)
{
int nval =  *(psrc + i);
if (15 >= nval && 0 <= nval)
{
if (9 >= nval && 0 <= nval)
{
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = '0' + nval;
nNum += 2;
continue;
}
switch (nval)//下面的算法中,把一个ascll字符转换为2个16进制数字,如果ascll小于F那么高位补0
{
case 10:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'A';
break;
case 11:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'B';
break;
case 12:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'C';
break;
case 13:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'D';
break;
case 14:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'E';
break;
case 15:
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = 'F';
break;
}
nNum += 2;
}
else if (255 >= nval &&15 < nval)
{
int nRun = nval / 16;
int nRem = nval%16;

switch (nRun)
{

case 10:
*(dst + i * 2) = 'A';
break;
case 11:
*(dst + i * 2) = 'B';
break;
case 12:
*(dst + i * 2) = 'C';
break;
case 13:
*(dst + i * 2) = 'D';
break;
case 14:
*(dst + i * 2) = 'E';
break;
case 15:
*(dst + i * 2) = 'F';
break;
}
if (9 >= nRun)
{
*(dst + i * 2) = '0' + nRun;
nNum ++;
}
else
{
nNum ++;
}
if (9 >= nRem)
{
*(dst + i * 2 + 1) = '0' + nRem;
nNum ++;
continue;
}
switch (nRem)//个位
{
case 10:
*(dst + i * 2 + 1) = 'A';
break;
case 11:
*(dst + i * 2 + 1) = 'B';
break;
case 12:
*(dst + i * 2 + 1) = 'C';
break;
case 13:
*(dst + i * 2 + 1) = 'D';
break;
case 14:
*(dst + i * 2 + 1) = 'E';
break;
case 15:
*(dst + i * 2 + 1) = 'F';
break;
}
nNum ++;
}
else
{
*(dst + i * 2) = '0';
*(dst + i * 2 + 1) = '0';
nNum += 2;
}
}
return nNum;
}


实现原理:

1.根据8位ascll码(unsignal char)最大255,转换成16进制为FF。

2.每4位表示一个16进制数字,如果ascll码小于等于F也就是只有低4位,那么16进制高位补零。

下一章讲解16进制转换Ascll格式方法!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据 Ascll