一個快速將十六進制串轉十進制數的方法

    今天看到一段將十六進制數的字符轉十進制的代碼,寫得太精妙了。我就又佔了前輩們的光,在其基礎上擴充了一下,寫了個將十六進制字符串轉十進制數的接口,和大家分享分享。

點擊(此處)摺疊或打開

  1. /******************************hex2digit.c*****************************************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>

  5. #define HEXTD(x) (((x)<='9')?((x)-'0'):(((x)&7)+9))  //這就是那段精妙的核心代碼

  1. /* hex_to_digit:將一個由字符串表示的十六進制字串轉換成其對應的十進制數
  2.  * 輸入: src 十六進制的字串。
  3.  * 輸出: sum 用於接收轉換後的結果。
  4.  * 返回值: -1 表示輸入的數據有錯誤;-2 表示輸入字串中有非法的字符; 0 表示轉換成功。
  5.  */
  1. int hex_to_digit(unsigned int *sum,char* src){
  2.     if(!src || !sum || strlen(src) == 0)
  3.         return -1;

  4.     *sum ^=*sum;
  5.     while(src && *src!='\0'){
  6.         if(!((*src>='0')&&(*src<='9'))&&!((*src>='a')&&(*src<='f'))&&!((*src>='A')&&(*src<='F')))
  7.                 return -2;
  8.         *sum = ((*sum << 4) | HEXTD(*src));
  9.         src++;
  10.     }
  11.     return 0;
  12. }

  13. int main(int argc,char** argv){
  14.     unsigned int a;
  15.     int ret = hex_to_digit(&a,argv[1]);

  16.     if(ret==-1)
  17.         printf("input error!\n");
  18.     else if(ret==-2)
  19.         printf("illegal letter in string!\n");
  20.     else
  21.         printf("Result is : %lu\n",a);
  22.     return 0;
  23. }
    編譯運行,其結果如下:
   上述接口還存在有待優化和完善的地方,例如是否可以支持形如"0x804Ed..."這樣的十六進制串.在32爲系統上,可以表示的最大無符號整形是232-1= 4294967295,如果想表示更大的數可以用unsigned long long 型等等.
   這個程序沒有做過充分的測試,不足之處懇請各位予以指正,謝謝。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(4122) | 評論(2) | 轉發(7) |
給主人留下些什麼吧!~~
58_avatar_small.jpg

wjlkoorey2582013-04-10 22:14:00

Bean_lee:我記得有本書是專門講這種技巧的。大神John Carmack當年也有很神奇的magic number的故事。
不過,我覺得如果這些工作應該交給編寫底層庫的人去做,如果我們每個人都要考慮這麼多,就太累了。

我也是看源碼時看到的,所以就記錄下來了。因爲自己以前寫過這麼一個接口,現在感覺那是相當的挫啊,呵呵

回覆 | 舉報
06_avatar_small.jpg

Bean_lee2013-04-10 18:00:01

我記得有本書是專門講這種技巧的。大神John Carmack當年也有很神奇的magic number的故事。
不過,我覺得如果這些工作應該交給編寫底層庫的人去做,如果我們每個人都要考慮這麼多,就太累了。

評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章