2015-11-29 31 views
0

我想將由用戶填充的char數組(如下面代碼中的part1)轉換爲十六進制數。實際上,將兩個char轉換爲一個十六進制的char如何將char數組轉換爲十六進制

char part1[2]; 
char ans; 
part1[0]='f'; 
part1[1]='2'; 

現在我可以把part1六角燒焦ans這樣的:

ans=0xf2; 
+3

有什麼問題嗎? –

+0

我如何獲得答案? –

回答

2

第1步:分析每個文本字符數字:

unsigned int parse_char(char c) 
{ 
    if ('0' <= c && c <= '9') return c - '0'; 
    if ('a' <= c && c <= 'f') return 10 + c - 'a'; 
    if ('A' <= c && c <= 'F') return 10 + c - 'A'; 

    abort(); 
} 

第2步:用數學來按照地點值表示法的規則彙總結果:

unsigned char ans = parse_char(part1[0]) * 0x10 + parse_char(part1[1]); 
+0

我把'f1'和ans = 51.但我想ans = 0xf1。謝謝你的回答 –

+1

@ Farshid.M:它沒有。此代碼有效。 – usr2564301

+0

是的,這是正確的。謝謝。 –

1

這是可能的解決方案:

unsigned char CharToHex(char c) 
{ 
    switch(c) { 
     case '0': return 0; 
     case '1': return 1; 
     case '2': return 2; 
     case '3': return 3; 
     case '4': return 4; 
     case '5': return 5; 
     case '6': return 6; 
     case '7': return 7; 
     case '8': return 8; 
     case '9': return 9; 
     case 'a': case 'A': return 10; 
     case 'b': case 'B': return 11; 
     case 'c': case 'C': return 12; 
     case 'd': case 'D': return 13; 
     case 'e': case 'E': return 14; 
     case 'f': case 'F': return 15; 
    } 
    return 16; 
} 

// return 0 if error occurred 
int Convert(const char* source, char* dest) 
{ 
    for(int i = 0; source[i] != '\0' && source[i + 1] != '\0'; i += 2) { 
     unsigned char hex1 = CharToHex(source[i]); 
     unsigned char hex2 = CharToHex(source[i + 1]); 
     if(hex1 == 16 || hex2 == 16) { 
      return 0; 
     } 
     *dest = (char)(hex1 << 4 | hex2); 
     dest++; 
    } 
    return 1; 
} 

UPDATE:

這些方法字符轉換爲它的十六進制數字:

// variant 1 
unsigned char CharToHex(char c) 
{ 
    if(c >= '0' && c <= '9') { 
     return (c - '0'); 
    } 
    if(c >= 'a' && c <= 'f') { 
     return (c - 'a' + 10); 
    } 
    if(c >= 'A' && c <= 'F') { 
     return (c - 'A' + 10); 
    } 
    return 16; 
} 
// variant 2 
unsigned char CharToHex(char c) 
{ 
    c = tolower(c); 
    if(c >= '0' && c <= '9') { 
     return (c - '0'); 
    } 
    if(c >= 'a' && c <= 'f') { 
     return (c - 'a' + 10); 
    } 
    return 16; 
} 
// variant 3 
unsigned char CharHexConversionTable[256] = { 
    // ascii 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 16, 16, 16, 16, 16, 
    16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    // rest 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 
}; 
unsigned char CharToHex(char c) 
{ 
    return CharHexConversionTable[(unsigned char)c]; 
} 
+0

有什麼方法沒有使用開關和大小寫?感謝您的回答 –

相關問題