C通用函数:ASCII与十六制字符串互相转换

在用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 [email protected]
//十六制字符串转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 [email protected]
//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;
}

C语言中,字符和其ASCII码是等价的,比如’A’这个字符和单字节整数65是等价的.
比如char c=’A’;int a=c;的话,a就是65

//函 数 名:CharToHex()
//功能描述:把ASCII字符转换为16进制
//函数说明:
//调用函数:
//全局变量:
//输 入:ASCII字符
//返 回:16进制
/////////////////////////////////////////////////////////////////////
unsigned char CharToHex(unsigned char bHex){
if((bHex>=0)&&(bHex<=9))
bHex += 0x30;
else if((bHex>=10)&&(bHex<=15))//大写字母
bHex += 0x37;
else bHex = 0xff;
return bHex;
}
/////////////////////////////////////////////////////////////////////
//函 数 名:HexToChar()
//功能描述:把16进制转换为ASCII字符
//函数说明:
//调用函数:
//全局变量:
//输 入:16进制
//返 回:ASCII字符
/////////////////////////////////////////////////////////////////////
unsigned char HexToChar(unsigned char bChar){
if((bChar>=0x30)&&(bChar<=0x39))
bChar -= 0x30;
else if((bChar>=0x41)&&(bChar<=0x46))//大写字母
bChar -= 0x37;
else if((bChar>=0x61)&&(bChar<=0x66))//小写字母
bChar -= 0x57;
else bChar = 0xff;
return bChar;

你可能感兴趣的:(程序员)