免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
ASCII與十六制字符串互相轉換
userphoto

2015.07.15

關注

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

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

  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.                  {//連續(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字符串轉十六制字符串
  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. }
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
python整數(shù)、字符串、字節(jié)串相互轉換 | Lixingcong
C字符串 與 uint32類型互相轉換
C語言sprintf()函數(shù):將格式化的數(shù)據(jù)寫入字符串
MySQL的字符串函數(shù)大全
char轉16進制字符串:0x1A-->1A
字符串查找
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服