乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       niudp 2015-07-15

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

      Andrew Huang <bluedrum@163.com>  轉(zhuǎn)載請注明作者及聯(lián)絡(luò)方式
        在用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)對應(yīng)的二進制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)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多