将数字字符串两位一组转换为16进制数
2014-08-04 12:00
435 查看
在串口通信编程中,经常要将一个数字字符串转换为16进制数,通过还口发送出去,而字符通常是以ASCII码发送。给定任意16进制数字字符串,2位一组转换为16进制数。
方法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、利用位运算来实现
当然也可以利用位运算实现方向运算:
方法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; }
相关文章推荐
- 二、十进制数字快速转换为16进制字符
- 将16进制的"49206C6F766520796F7521"(每两位表示一个数)转换成字符输出。
- 用js正则判断输入的两位字符,第一位是数字16进制的,第二位是I、O、Q、U除外的字母(A到Z)
- Perl中的数字比较、字符比较及类型转换
- JavaScript的类型转换(字符转数字,数字转字符)
- 二者都是将 byte[] 转换成字符串,一个区别在于 Convert.ToBase64String 使用 base 64 数字编码,所以它生成的全部是 ASCII 字符。
- Java中实现数字金额到中文大写字符的转换!!
- JavaScript的类型转换(字符转数字,数字转字符)
- DB2中字符、数字和日期类型之间的转换
- Java中实现数字金额到中文大写字符的转换!!
- 字符转换为16进制和整数等的方法
- JAVA16进制字符串转字符或数字
- UTF-8与Unicode字符的相互转换 与 16进制Unicode转换汉字 重用代码
- Java中实现数字金额到中文大写字符的转换!! 选择自 netfalcon 的 Blog
- ORA-06502: PL/SQL: 数字或值错误 : 字符到数值的转换错误
- UTF-8与Unicode字符的相互转换 与 16进制Unicode转换汉字
- PHP中实现数字金额到中文大写字符的转换
- 数字按一定的规律转换成字符
- *数字——字符之间的转换(转)
- 数字转换成字符(C#)