Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1638073
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: C/C++

2011-07-28 15:46:06

Andrew Huang  转载请注明作者及联络方式

  在用QT做一个串口通讯软件。在接收数据时,一般的串口收发软件的数据窗口都有ASCII显示模式,也可以转换成HEX十六进制模式。这样有利调试。

 因此写了两个函数进行转换,其中ASCII转16进制算法非常简单,只是简单转换一下即可。 但是16进制转ASCII码的算法较难一点。 一是有可能用户误输入破坏数据合法性,另外为美观二个进制数之间用空格隔开。但是空格有时会被删除,或者空格会被多加。这些情况在转换时都需要考虑了。

  在实际项目测试比较满意,在界面切换界面不错.

  注意这里用了C的一个特殊语法:内嵌函数,str2bin(),它的特点是直接可以引用其父函数所有局部变量,这样的可以大大减少函数参数的。


  1. //16进制ASCII字符串转对应的二进制BUFFER.
  2. //每个BYTE之间可以有空格
  3. // 合法字符串:
  4. // ab 00 DE ==>> AB 00 DE
  5. // Ab00 DE ==>> AB 00 DE
  6. // d 0 DEa ==> 0D 00 DE 0A

  7. //Author Andrew Huang
  8. //十六制字符串转ASCII字符串
  9. int OS_HexStrToBuf(const char * hex_str,char * hex_buf,int buf_len)
  10. {
  11.    char * p ;
  12.    int cnt=0;
  13.    char num[8];
  14.    int idx =0,pos = 0;

  15.    int str2bin(){
  16.         unsigned char ch;
  17.         num[pos] =0;
  18.        
  19.          ch = (char )strtol(num,NULL,16);
  20.          //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);
  21.         

  22.            hex_buf[idx++] = ch;
  23.          if(idx == buf_len)
  24.               return -1;

  25.          pos = 0;    

  26.          return ch;
  27.        }
  28.    
  29.    for(p= (char *)hex_str; *p==' ' ; p++){
  30.         cnt++ ;//滤掉开始空格
  31.        }
  32.        
  33.    for(; *p!=0 ;p++)
  34.        {
  35.         //printf("cnt %d, *p %c\n",cnt,*p);
  36.     
  37.     
  38.         if(*p==' ')
  39.             {
  40.              if(p[-1] ==' ')
  41.                  {//连续空格
  42.                   pos = 0;
  43.                   continue;
  44.                  }
  45.             
  46.          if(str2bin() == -1)
  47.                 return -1;
  48.             
  49.          continue;
  50.                   
  51.             }
  52.        else if(pos == 2)
  53.            {
  54.             if(str2bin() == -1)
  55.                 return -1;
  56.            }

  57.      if(!isxdigit(*p))
  58.             return -2;
  59.         
  60.         num[pos++] = *p;
  61.         //printf("set pos %d %c\n",pos-1,*p);
  62.         

  63.         cnt++;
  64.         
  65.        }

  66.    if(pos > 0 )
  67.        {
  68.        
  69.         if(str2bin() == -1)
  70.                 return -1;
  71.        }
  72.    

  73.    //printf("return %d,pos %d\n",idx,pos);

  74.    return idx;
  75. }
  76. //Author : Andrew Huang
  77. //ASCII字符串转十六制字符串
  78. int OS_StrToHexStr(const char * str,char * hex_str,int buf_len)
  79. {
  80.    char * p ,* pstr = hex_str;
  81.    int size,len = buf_len;
  82.     for(p = (char *)str;*p!=0; p++)
  83.         {
  84.          size = snprintf(pstr,len," %02X",*p);
  85.          len-=size;
  86.          if(len <=0)
  87.              return -1;

  88.          pstr+=size;
  89.         }

  90.     *pstr = 0;

  91.     return buf_len-len;
  92. }


阅读(9349) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~