Konvertiere Hexadezimalzeichenfolge (char ) in int?

Ich habe ein char [], das einen Wert wie “0x1800785” enthält, aber die function, der ich den Wert geben möchte, erfordert ein int, wie kann ich dies in ein int konvertieren? Ich habe gesucht, kann aber keine Antwort finden. Vielen Dank.

Hast du strtol() ausprobiert?

strtol – wandelt die Zeichenfolge in eine lange Ganzzahl um

Beispiel:

 const char *hexstring = "abcdef0"; int number = (int)strtol(hexstring, NULL, 16); 

Falls die String-Darstellung der Zahl mit einem 0x Präfix beginnt, muss man 0 als Basis verwenden:

 const char *hexstring = "0xabcdef0"; int number = (int)strtol(hexstring, NULL, 0); 

(Es ist auch möglich, eine explizite Basis wie 16 anzugeben, aber ich würde nicht empfehlen, Redundanz einzuführen.)

So etwas könnte nützlich sein:

 char str[] = "0x1800785"; int num; sscanf(str, "%x", &num); printf("0x%x %i\n", num, num); 

Lies man sscanf

Angenommen du meinst es ist eine Schnur, wie wärs mit strtol ?

Oder wenn Sie Ihre eigene Implementierung haben wollen, habe ich diese Schnellfunktion als Beispiel geschrieben:

 /** * hex2int * take a hex string and convert it to a 32bit number (max 8 hex digits) */ uint32_t hex2int(char *hex) { uint32_t val = 0; while (*hex) { // get current character then increment uint8_t byte = *hex++; // transform hex character to the 4bit equivalent number, using the ascii table indexes if (byte >= '0' && byte < = '9') byte = byte - '0'; else if (byte >= 'a' && byte < ='f') byte = byte - 'a' + 10; else if (byte >= 'A' && byte < ='F') byte = byte - 'A' + 10; // shift 4 to make space for new digit, and add the 4 bits of the new digit val = (val << 4) | (byte & 0xF); } return val; } 

Probieren Sie den folgenden Codeblock aus, der für mich funktioniert.

 char *p = "0x820"; uint16_t intVal; sscanf(p, "%x", &intVal); printf("value x: %x - %d", intVal, intVal); 

Ausgabe ist:

 value x: 820 - 2080 

Also, nach einer Weile der Suche, und herauszufinden, dass Strtol ziemlich langsam ist, habe ich meine eigene function codiert. Es funktioniert nur für Großbuchstaben auf Buchstaben, aber das Hinzufügen von Kleinbuchstaben ist kein Problem.

 int hexToInt(PCHAR _hex, int offset = 0, int size = 6) { int _result = 0; DWORD _resultPtr = reinterpret_cast(&_result); for(int i=0;i= 0x30 && _firstChar < = 0x39) _multiplierFirstValue = _firstChar - 0x30; else if(_firstChar >= 0x41 && _firstChar < = 0x46) _multiplierFirstValue = 10 + (_firstChar - 0x41); char _secndChar = _hex[offset + i + 1]; if(_secndChar >= 0x30 && _secndChar < = 0x39) _addonSecondValue = _secndChar - 0x30; else if(_secndChar >= 0x41 && _secndChar < = 0x46) _addonSecondValue = 10 + (_secndChar - 0x41); *(BYTE *)(_resultPtr + (size / 2) - (i / 2) - 1) = (BYTE)(_multiplierFirstValue * 16 + _addonSecondValue); } return _result; } 

Verwendung:

 char *someHex = "#CCFF00FF"; int hexDevalue = hexToInt(someHex, 1, 8); 

1, weil das Hex, das wir konvertieren wollen, bei Offset 1 und 8 beginnt, weil es die Hex-Länge ist.

Speedtest (1.000.000 Anrufe):

 strtol ~ 0.4400s hexToInt ~ 0.1100s 

Ich habe eine ähnliche Sache gemacht, denke, dass es dir helfen könnte, dass es tatsächlich für mich arbeitet

 int main(){ int co[8],i;char ch[8];printf("please enter the string:");scanf("%s",ch);for(i=0;i< =7;i++){if((ch[i]>='A')&&(ch[i]< ='F')){co[i]=(unsigned int)ch[i]-'A'+10;}else if((ch[i]>='0')&&(ch[i]< ='9')){co[i]=(unsigned int)ch[i]-'0'+0;}} 

Hier habe ich nur eine Zeichenfolge von 8 Zeichen genommen. Wenn du willst, dass du ähnliche Logik für 'a' zu 'f' hinzufügen kannst, um ihre äquivalenten hex Werte zu geben, habe ich das nicht getan, weil ich es nicht gebraucht habe.

Ich habe eine Bibliothek erstellt, um Hexadezimal / Dezimal-Konvertierung ohne die Verwendung von stdio.h . Sehr einfach zu bedienen:

 unsigned hexdec (const char *hex, const int s_hex); 

Vor der ersten Konvertierung initialisieren Sie das zur Konvertierung verwendete Array mit:

 void init_hexdec (); 

Hier der Link auf github: https://github.com/kevmuret/libhex/

Verwenden Sie xtoi (stdlib.h). Die Zeichenfolge hat als erste zwei Indizes “0x”, also trimmen Sie val [0] und val [1] aus, indem Sie xtoi & val [2] senden.

xtoi( &val[2] );

Ich weiß, das ist wirklich alt, aber ich denke, die Lösungen sahen zu kompliziert aus. Versuchen Sie es in VB:

 Public Function HexToInt(sHEX as String) as long Dim iLen as Integer Dim i as Integer Dim SumValue as Long Dim iVal as long Dim AscVal as long iLen = Len(sHEX) For i = 1 to Len(sHEX) AscVal = Asc(UCase(Mid$(sHEX, i, 1))) If AscVal >= 48 And AscVal < = 57 Then iVal = AscVal - 48 ElseIf AscVal >= 65 And AscVal < = 70 Then iVal = AscVal - 55 End If SumValue = SumValue + iVal * 16 ^ (iLen- i) Next i HexToInt = SumValue End Function