Eine schnelle und schmutzige Lösung:
int ahex2int(char a, char b){
a = (a <= '9') ? a - '0' : (a & 0x7) + 9;
b = (b <= '9') ? b - '0' : (b & 0x7) + 9;
return (a << 4) + b;
}
Sie müssen sicher sein, dass Ihre Eingabe korrekt ist, keine Validierung enthalten (man könnte sagen, es ist C). Gut, dass es ziemlich kompakt ist, es funktioniert sowohl mit 'A' bis 'F' als auch mit 'a' bis 'f'.
Der Ansatz basiert auf der Position der Alphabetzeichen in der ASCII-Tabelle. Schauen wir uns beispielsweise Wikipedia an ( https://en.wikipedia.org/wiki/ASCII#/media/File:USASCII_code_chart.png ). Kurz gesagt, die Zahlen befinden sich unter den Zeichen, sodass die numerischen Zeichen (0 bis 9) leicht konvertiert werden können, indem der Code für Null subtrahiert wird. Die alphabetischen Zeichen (A bis F) werden gelesen, indem andere als die letzten drei Bits auf Null gesetzt werden (was effektiv dazu führt, dass entweder Groß- oder Kleinbuchstaben verwendet werden), eins subtrahiert wird (da das Alphabet nach der Bitmaskierung an Position eins beginnt) und zehn addiert werden ( weil A bis F den 10. bis 15. Wert im Hexadezimalcode darstellen). Schließlich müssen wir die beiden Ziffern kombinieren, die das untere und obere Halbbyte der codierten Zahl bilden.
Hier gehen wir mit dem gleichen Ansatz (mit geringfügigen Abweichungen):
#include <stdio.h>
long ahex2num(unsigned char *in){
unsigned char *pin = in;
long out = 0;
while(*pin != 0){
out <<= 4;
out += (*pin < 'A') ? *pin & 0xF : (*pin & 0x7) + 9;
pin++;
}
return out;
}
int main(void) {
unsigned char str[] = "1800785";
long num;
num = ahex2num(str);
printf("Input: %s\n",str);
printf("Output: %x\n",num);
printf("Check: %ld = %ld \n",num,0x1800785);
return 0;
}