您的位置:首页 > 其它

将数字字符串两位一组转换为16进制数

2014-08-04 12:00 435 查看
在串口通信编程中,经常要将一个数字字符串转换为16进制数,通过还口发送出去,而字符通常是以ASCII码发送。给定任意16进制数字字符串,2位一组转换为16进制数。

方法1:之前不知道有strtol()函数,所以搞了个蛮力的办法

int StringToHex(char *DigitalStr,char *lpWrite)
{
int len = strlen(DigitalStr);
char temp[3],str[3];
memset(temp,0,sizeof(temp));
memset(str,0,sizeof(str));
int p = 0;
int count = 0;
int j = 0;
if(len % 2 == 0)
{
for( ; p < len; p++)
{
if(DigitalStr[p] == '0' && DigitalStr[p+1] == '0')
lpWrite[count++] = 0x00;
else if(DigitalStr[p] == '0')
{
switch(DigitalStr[p+1])
{
case '1':lpWrite[count++] = 0x01;break;
case '2':lpWrite[count++] = 0x02;break;
case '3':lpWrite[count++] = 0x03;break;
case '4':lpWrite[count++] = 0x04;break;
case '5':lpWrite[count++] = 0x05;break;
case '6':lpWrite[count++] = 0x06;break;
case '7':lpWrite[count++] = 0x07;break;
case '8':lpWrite[count++] = 0x08;break;
case '9':lpWrite[count++] = 0x09;break;
case 'A':lpWrite[count++] = 0x0A;break;
case 'B':lpWrite[count++] = 0x0B;break;
case 'C':lpWrite[count++] = 0x0C;break;
case 'D':lpWrite[count++] = 0x0D;break;
case 'E':lpWrite[count++] = 0x0E;break;
case 'F':lpWrite[count++] = 0x0F;break;
case 'a':lpWrite[count++] = 0x0a;break;
case 'b':lpWrite[count++] = 0x0b;break;
case 'c':lpWrite[count++] = 0x0c;break;
case 'd':lpWrite[count++] = 0x0d;break;
case 'e':lpWrite[count++] = 0x0e;break;
case 'f':lpWrite[count++] = 0x0f;break;
default:lpWrite[count++] =	0x00;break;
}
}
else//前两条if语句可以去掉,从串口发送时,只有一位的话,系统自动高位补零
{
strncpy(str,DigitalStr+p,2);
for(j = 0;j < 2;j++)
{
if(str[j]>='0' && str[j]<='9') temp[j]=str[j]-'0';
else if(str[j]>='A' && str[j]<='F') temp[j]=str[j]-'A'+ 0x0A;
else if(str[j]>='a' && str[j]<='f') temp[j]=str[j]-'a'+ 0x0a;
else return -1;
}
lpWrite[count++] = temp[0]*16 + temp[1];
}
p++;
}
return count;
}
else
return -1;
}
方法2:有了strtol()函数,事情变得简便多了

int StringToHex(char *DigitalStr,char *lpWrite)
{
int len = strlen(DigitalStr);
char str[3];
memset(str,0,sizeof(str));
int count = 0;
int j = 0;
if(len % 2 == 0)
{
for(;j < len;j += 2)
{
strncpy(str,DigitalStr+j,2);
lpWrite[count++] = strtol(str,NULL,16);
}
return count;
}
else
return -1;
}
strtol函数原型:

long int strtol(const char *nptr,char **endptr,int base);

nptr:目标字符串

endptr:一个传出参数,函数返回时指向后面未被识别的第一个字符。例如char *pos; strtol("123abc", &pos, 10);,strtol返回123,pos指向字符串中的字母a。如果字符串开头没有可识别的整数,例如char *pos; strtol("ABCabc",
&pos, 10);,则strtol返回0,pos指向字符串开头,可以据此判断这种出错的情况。

base:指定进制基数(范围2~36),默认10进制(base为0)

方法3、利用位运算来实现

int StringToHex(char *str,char *data)
{
char ch1,ch2;
int len = strlen(str);
memset(data,0,sizeof data);
for (int i = 0;i < len/2;i++)
{
ch1 = str[i*2];
ch2 = str[i*2+1];
(ch1 >= 'a' && ch1 <= 'z') ? (ch1 -= 32) : (ch1);
(ch2 >= 'a' && ch1 <= 'z') ? (ch2 -= 32) : (ch2);
ch1 -= ((ch1 > '9') ? 0x37 : 0x30);
ch2 -= ((ch2 > '9') ? 0x37 : 0x30);
data[i] = (ch1 << 4) | ch2;
}
return len/2;
}


当然也可以利用位运算实现方向运算:

int HexToString(char *str,char *data)
{
char ch1,ch2;
int len = strlen(str);
memset(data,0,sizeof data);
for (int i = 0; i < len;i++)
{
ch1 = (str[i] & 0xF0) >> 4;
ch2 = str[i] & 0x0F;
ch1 += ((ch1 > 9) ? 0x37 : 0x30);
ch2 += ((ch2 > 9) ? 0x37 : 0x30);
data[i*2] = ch1;
data[i*2+1] = ch2;
}
return len*2;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: