wake-up-neo.com

Hex-String (char []) in int konvertieren?

Ich habe ein Zeichen [], das einen Wert wie "0x1800785" enthält, aber die Funktion, der ich den Wert geben möchte, erfordert ein int. Wie kann ich dieses in ein int konvertieren? Ich habe herumgesucht, finde aber keine Antwort. Vielen Dank.

69
kizyle502

Haben Sie strtol() ausprobiert?

strtol - konvertiert eine Zeichenfolge in eine lange Ganzzahl

Beispiel:

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

Falls die Zeichenfolgendarstellung der Zahl mit einem 0x-Präfix beginnt, eins 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 nicht empfehlen, Redundanz einzuführen.)

179
user529758

So etwas könnte nützlich sein:

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

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

Lesen Sie man sscanf

19
saxi

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

9

Oder wenn Sie eine eigene Implementierung wünschen, 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;
}
9
radhoo

Versuchen Sie es unterhalb des Codeblocks, es funktioniert für mich.

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

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

Ausgabe ist:

value x: 820 - 2080
4
Dig The Code

Nach einer Weile des Suchens und Herausfinden, dass strtol ziemlich langsam ist, habe ich meine eigene Funktion programmiert. Es funktioniert nur für Groß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;
}

Verwendungszweck:

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

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

Speedtest (1.000.000 Anrufe):

strtol ~ 0.4400s
hexToInt ~ 0.1100s
3
mexikanoZ

Verwenden Sie strtol, wenn Sie libc zur Verfügung haben, wie in der oberen Antwort vorgeschlagen. Wenn Sie jedoch benutzerdefinierte Inhalte mögen oder sich auf einem Mikrocontroller ohne libc befinden, möchten Sie möglicherweise eine leicht optimierte Version ohne komplexe Verzweigung.

#include <inttypes.h>


/**
 * xtou64
 * Take a hex string and convert it to a 64bit number (max 16 hex digits).
 * The string must only contain digits and valid hex characters.
 */
uint64_t xtou64(const char *str)
{
    uint64_t res = 0;
    char c;

    while ((c = *str++)) {
        char v = (c & 0xF) + (c >> 6) | ((c >> 3) & 0x8);
        res = (res << 4) | (uint64_t) v;
    }

    return res;
} 

Die Bit-Shifting-Magie läuft auf Folgendes hinaus: Verwenden Sie einfach die letzten 4 Bits. Wenn es sich jedoch um eine nicht zifferige Zahl handelt, fügen Sie ebenfalls 9 hinzu.

0
LimeRed

ich habe etwas Ähnliches getan, ich glaube, es könnte helfen, 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 Zeichenkette mit 8 Zeichen genommen. Wenn Sie wollen, können Sie eine ähnliche Logik für 'a' bis 'f' hinzufügen, um die entsprechenden Hex-Werte anzugeben . 

0
sairam singh

Ich habe eine Bibliothek erstellt, um die Hexadezimal-/Dezimal-Konvertierung ohne stdio.h durchzuführen. 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 zu github: https://github.com/kevmuret/libhex/

0
kevmuret