日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

ASCII與十六制字符串互相轉(zhuǎn)換

 niudp 2015-07-15

C通用函數(shù):ASCII與十六制字符串互相轉(zhuǎn)換

Andrew Huang <bluedrum@163.com>  轉(zhuǎn)載請注明作者及聯(lián)絡方式
  在用QT做一個串口通訊軟件。在接收數(shù)據(jù)時,一般的串口收發(fā)軟件的數(shù)據(jù)窗口都有ASCII顯示模式,也可以轉(zhuǎn)換成HEX十六進制模式。這樣有利調(diào)試。
 因 此寫了兩個函數(shù)進行轉(zhuǎn)換,其中ASCII轉(zhuǎn)16進制算法非常簡單,只是簡單轉(zhuǎn)換一下即可。 但是16進制轉(zhuǎn)ASCII碼的算法較難一點。 一是有可能用戶誤輸入破壞數(shù)據(jù)合法性,另外為美觀二個進制數(shù)之間用空格隔開。但是空格有時會被刪除,或者空格會被多加。這些情況在轉(zhuǎn)換時都需要考慮了。
  在實際項目測試比較滿意,在界面切換界面不錯.
  注意這里用了C的一個特殊語法:內(nèi)嵌函數(shù),str2bin(),它的特點是直接可以引用其父函數(shù)所有局部變量,這樣的可以大大減少函數(shù)參數(shù)的。

  1. //16進制ASCII字符串轉(zhuǎn)對應的二進制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. //十六制字符串轉(zhuǎn)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.                  {//連續(xù)空格
  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字符串轉(zhuǎn)十六制字符串
  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. }

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多