Andrew Huang
转载请注明作者及联络方式
在用QT做一个串口通讯软件。在接收数据时,一般的串口收发软件的数据窗口都有ASCII显示模式,也可以转换成HEX十六进制模式。这样有利调试。
因此写了两个函数进行转换,其中ASCII转16进制算法非常简单,只是简单转换一下即可。 但是16进制转ASCII码的算法较难一点。 一是有可能用户误输入破坏数据合法性,另外为美观二个进制数之间用空格隔开。但是空格有时会被删除,或者空格会被多加。这些情况在转换时都需要考虑了。
在实际项目测试比较满意,在界面切换界面不错.
注意这里用了C的一个特殊语法:内嵌函数,str2bin(),它的特点是直接可以引用其父函数所有局部变量,这样的可以大大减少函数参数的。
- //16进制ASCII字符串转对应的二进制BUFFER.
-
//每个BYTE之间可以有空格
-
// 合法字符串:
-
// ab 00 DE ==>> AB 00 DE
-
// Ab00 DE ==>> AB 00 DE
-
// d 0 DEa ==> 0D 00 DE 0A
-
- //Author Andrew Huang
-
//十六制字符串转ASCII字符串
-
int OS_HexStrToBuf(const char * hex_str,char * hex_buf,int buf_len)
-
{
-
char * p ;
-
int cnt=0;
-
char num[8];
-
int idx =0,pos = 0;
-
-
int str2bin(){
-
unsigned char ch;
-
num[pos] =0;
-
-
ch = (char )strtol(num,NULL,16);
-
//printf("pos=%d,idx %d,*p=%c,p-1=%c,offset %d,ch %02x num \"%s\"\n",pos,idx,*p,p[-1],cnt,hex_buf[idx-1],num);
-
-
-
hex_buf[idx++] = ch;
-
if(idx == buf_len)
-
return -1;
-
-
pos = 0;
-
-
return ch;
-
}
-
-
for(p= (char *)hex_str; *p==' ' ; p++){
-
cnt++ ;//滤掉开始空格
-
}
-
-
for(; *p!=0 ;p++)
-
{
-
//printf("cnt %d, *p %c\n",cnt,*p);
-
-
-
if(*p==' ')
-
{
-
if(p[-1] ==' ')
-
{//连续空格
-
pos = 0;
-
continue;
-
}
-
-
if(str2bin() == -1)
-
return -1;
-
-
continue;
-
-
}
-
else if(pos == 2)
-
{
-
if(str2bin() == -1)
-
return -1;
-
}
-
-
if(!isxdigit(*p))
-
return -2;
-
-
num[pos++] = *p;
-
//printf("set pos %d %c\n",pos-1,*p);
-
-
-
cnt++;
-
-
}
-
-
if(pos > 0 )
-
{
-
-
if(str2bin() == -1)
-
return -1;
-
}
-
-
-
//printf("return %d,pos %d\n",idx,pos);
-
-
return idx;
-
}
- //Author : Andrew Huang
-
//ASCII字符串转十六制字符串
-
int OS_StrToHexStr(const char * str,char * hex_str,int buf_len)
-
{
-
char * p ,* pstr = hex_str;
-
int size,len = buf_len;
-
for(p = (char *)str;*p!=0; p++)
-
{
-
size = snprintf(pstr,len," %02X",*p);
-
len-=size;
-
if(len <=0)
-
return -1;
-
-
pstr+=size;
-
}
-
-
*pstr = 0;
-
-
return buf_len-len;
-
}
阅读(9470) | 评论(0) | 转发(1) |