[C/C++] 將字串轉成 16 進位

最近在碰嵌入式系統遇到一個還蠻常見的問題,我要將16進位的字串(例如 AAC2) test 轉成16進位的 unsigned int,讓我可以進行 & | not 一些二進位運算,底下是轉換程式,大家參考看看 int power(int x,int n) { int i; int num = 1; for(i=1;i<=n;i++) num*=x; return num; } int transfer_string_to_hex(unsigned char *str_name) { char string[]="0123456789ABCDEF"; int number[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; int i = 0; int j = 0; int str_number = 0; for(i=0; ipow 這個函式可以使用,所以自己寫了 power 來取代,我用在偵測網路線是否有插上: int detect_wan_wire() { FILE *fp = NULL; unsigned char *pch; unsigned char buf[128] = {0}; unsigned int mask = 0x0004; int retry = 3; int res = 0; int i = 0; unsigned int a; unsigned int b; sprintf(buf, "mii_mgr -g -p 7 -r 1 > %s", WAN_FILE); system(buf); char * pEnd; long int li1, li2, li3, li4; for (i=0; iAND, OR, XOR, NOT 與16 進制
  • wintersxp

    無意間看到你寫的這段程式,或許你的程式執行結果並沒有問題,但我個人認為你在程式中多次使用到 sizeof(str_name),這部份是有邏輯上問題的。在目前常見的32位元平台中 sizeof(str_name)的結果固定為4(因為str_name是一個指標),如果你傳入的字串剛好是4個字元(ex. “b3a5″,那結果會剛好正確;但如果你傳入字串長度不是4個字元(ex. “a5”),將可能計算出錯誤的結果,個人建議您應該使用strlen(str_name)。

    另外想請教您一個問題,WAN_FILE這個字串的內容會是什麼,我也需要偵測網路線是否存在。

  • Tom Hung

    WAN_FILE 是利用mii_mgr -g -p 7 -r 1 > %s指令輸出的文字檔
    其實可以用popen讀到buf,就不用把那個輸出到文字檔再重新讀回

    transfer_text_to_hex 跟上面的
    int transfer_string_to_hex(unsigned char *str_name)
    不同名字,是筆誤?

    剛好也在寫這塊,感謝經驗分享 ^^

  • hi:

    感謝指正,的確是筆誤,抱歉。利用 popen 也是可以得到該值,這方法也是可以。
    後來把 WAN_FILE 檔案改成在 Driver 裡面做掉,在利用 proc 的 iotcl 方式去讀取就可以了