我想將由用戶填充的char
數組(如下面代碼中的part1
)轉換爲十六進制數。實際上,將兩個char
轉換爲一個十六進制的char
。如何將char數組轉換爲十六進制
char part1[2];
char ans;
part1[0]='f';
part1[1]='2';
現在我可以把part1
六角燒焦ans
這樣的:
ans=0xf2;
我想將由用戶填充的char
數組(如下面代碼中的part1
)轉換爲十六進制數。實際上,將兩個char
轉換爲一個十六進制的char
。如何將char數組轉換爲十六進制
char part1[2];
char ans;
part1[0]='f';
part1[1]='2';
現在我可以把part1
六角燒焦ans
這樣的:
ans=0xf2;
第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]);
這是可能的解決方案:
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];
}
有什麼方法沒有使用開關和大小寫?感謝您的回答 –
有什麼問題嗎? –
我如何獲得答案? –