2013-10-24 87 views
2

我有一個4字節的十六進制字符串,我想將它們轉換成c中的2字節整數。十六進制字符串轉換爲整數在C

我不能使用strtol,fprintf或fscanf。

我想這一點: -

unsigned char *hexstring = "12FF"; 

轉換爲這樣的: -

unsigned int hexInt = 0x12FF 
+0

提示:12FF是4863,將hex轉換爲整數 – P0W

+0

所以你想重寫C代碼?或者你有一個充滿4字節字符的文件需要進行hexified?無論哪種方式...聞起來像功課。 –

+0

強制性的「你有什麼試過」的評論。 –

回答

3

編輯:Doh,只是讀azmuhak建議的鏈接。這絕對是這個問題的重複。在azmuhak的鏈接答案也更加完整,因爲它以「0x」前綴交易...

下面將與使用標準庫鍛鍊 ... 看到它在ideone here

#include <stdio.h> 

#define ASCII_0_VALU 48 
#define ASCII_9_VALU 57 
#define ASCII_A_VALU 65 
#define ASCII_F_VALU 70 

unsigned int HexStringToUInt(char const* hexstring) 
{ 
    unsigned int result = 0; 
    char const *c = hexstring; 
    char thisC; 

    while((thisC = *c) != NULL) 
    { 
     unsigned int add; 
     thisC = toupper(thisC); 

     result <<= 4; 

     if(thisC >= ASCII_0_VALU && thisC <= ASCII_9_VALU) 
      add = thisC - ASCII_0_VALU; 
     else if(thisC >= ASCII_A_VALU && thisC <= ASCII_F_VALU) 
      add = thisC - ASCII_A_VALU + 10; 
     else 
     { 
      printf("Unrecognised hex character \"%c\"\n", thisC); 
      exit(-1); 
     } 

     result += add; 
     ++c; 
    } 

    return result; 
} 

int main(void) 
{ 
    printf("\nANSWER(\"12FF\"): %d\n", HexStringToUInt("12FF")); 
    printf("\nANSWER(\"abcd\"): %d\n", HexStringToUInt("abcd")); 

    return 0; 
} 

該代碼可以更有效率,我使用toupper庫函數,但你可以很容易地實現自己的...

此外,這不會解析字符串以「0x」開頭......但你可以添加在開始時對其進行快速檢查並且只是嚼碎那些字符...

+0

謝謝,正是我在找的東西。無需使用toupper,因爲我的應用程序以大寫形式發送所有字符。 – Remixed123

+1

您將使用ASCII字符而不是'#define ASCII_0_VALU'0''而不是'#define ASCII_0_VALU 48'這個整數。它可能更具可讀性。 – Jack

相關問題