2012-04-14 16 views
56

Ich habe ein char [], das einen Wert wie "0x1800785" enthält, aber die Funktion, die 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.Hexadezimalstring (char []) in int umwandeln?

+1

Sicherlich ist dies ein Duplikat ... –

+1

möglich Duplikat [string in signed int konvertieren] (http://stackoverflow.com/questions/3792610/ convert-string-in-signed-int) – bitmask

Antwort

153

Haben Sie versucht strtol()?

strtol - convert string to a long integer

Beispiel:

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

Bei der String-Darstellung der Zahl mit einem 0x Präfix beginnt, einen muss sollte 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 die Einführung von Redundanz nicht empfehlen y.)

+1

Perfekt gearbeitet, danke – kizyle502

+3

Wenn der Hexstring immer durch ein "0x" 'wie in der Frage angegeben eingeführt wird, sollte man' 0' anstelle von '16' verwenden. –

+0

Danke, das Beispiel auf [dieser Seite] (http://www.cplusplus.com/reference/cstdlib/strtol/) ist sehr detailliert. –

9

Angenommen, Sie meinen, es ist eine Zeichenfolge, wie wäre es mit strtol?

+4

Warum runter, das ernst? –

+0

Ich hatte ursprünglich mit strtod (-> double) statt strtol verbunden. Ich nehme an, jemand hat es gesehen, während ich es bearbeitet habe. –

+0

Nun, das ist kein großer Fehler ... der Compiler gibt den Rückgabewert automatisch aus, wenn er einem 'int' zugeführt wird. +1, BTW. –

17

Etwas Ähnliches könnte nützlich sein:

char str[] = "0x1800785"; 
int num; 

sscanf(str, "%x", &num); 
printf("0x%x %i\n", num, num); 

lesen man sscanf

0

ich einen librairy gemacht Hexadezimal/Dezimal-Umwandlung ohne die Verwendung von stdio.h zu machen. Sehr einfach zu bedienen:

für die Umwandlung verwendet
unsigned hexdec (const char *hex, const int s_hex); 

Vor der ersten Umwandlung intialize Array mit:

void init_hexdec(); 

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

2

unter Codeblock Versuchen, seine Arbeits für mich.

char *p = "0x820"; 
uint16_t intVal; 
sscanf(p, "%x", &intVal); 

printf("value x: %x - %d", intVal, intVal); 

Ausgang ist:

value x: 820 - 2080 
1

i eine ähnliche Sache getan haben, denken, dass es u helfen könnte, sein wirklich für mich arbeiten

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 ich nur eine Reihe von genommen haben 8 Charaktere. Wenn du willst, dass du ähnliche Logik für 'a' zu 'f' hinzufügen kannst, um ihre entsprechenden hex Werte zu geben, habe ich das nicht getan, weil ich es nicht gebraucht habe.

4

Oder wenn Sie Ihre eigene Implementierung haben wollen, schrieb ich diese schnelle Funktion als Beispiel:

/** 
* 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; 
} 
0

Verwenden 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]);

2

So, nach einer gewissen Zeit des Suchens, und herauszufinden, dass strtol ist ziemlich langsam, ich habe meine eigene Funktion 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<DWORD>(&_result); 
    for(int i=0;i<size;i+=2) 
    { 
     int _multiplierFirstValue = 0, _addonSecondValue = 0; 

     char _firstChar = _hex[offset + i]; 
     if(_firstChar >= 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; 
} 

Verbrauch:

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

1, weil die hex wir beginnt konvertieren möchten Offset 1 und 8, weil es die Hex-Länge ist.

Speedtest (1.000.000 Anrufe):

strtol ~ 0.4400s 
hexToInt ~ 0.1100s