分享

ASCII与十六制字符串互相转换

 niudp 2015-07-15

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

Andrew Huang <bluedrum@163.com>  转载请注明作者及联络方式
  在用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 <bluedrum@163.com>
  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 <bluedrum@163.com>
  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. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多