[c] 16 진수 문자열 (char [])을 int로 변환 하시겠습니까?

“0x1800785″와 같은 값을 포함하는 char []가 있지만 값을 제공하려는 함수에는 int가 필요합니다. 어떻게 이것을 int로 변환 할 수 있습니까? 주변을 수색했지만 답을 찾을 수 없습니다. 감사.



답변

시도해 보셨습니까 strtol()?

strtol-문자열을 긴 정수로 변환

예:

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

경우에 숫자의 문자열 표현은 시작 0x접두사, 하나는 있어야 기지로 0을 사용한다 :

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

(16과 같은 명시 적 기반을 지정하는 것도 가능하지만 중복성을 도입하는 것은 권장하지 않습니다.)


답변

또는 자체 구현을 원할 경우이 빠른 함수를 예로 작성했습니다.

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


답변

다음과 같은 것이 유용 할 수 있습니다.

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

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

남자 sscanf 읽기


답변

문자열이라고 가정하면 strtol은 어떻습니까?


답변

strtol최상위 답변이 제안한 것처럼 libc를 사용할 수 있으면 사용하십시오 . 그러나 사용자 정의 항목을 좋아하거나 libc가없는 마이크로 컨트롤러를 사용하는 경우 복잡한 분기없이 약간 최적화 된 버전을 원할 수 있습니다.

#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;
}

비트 이동 마법은 다음과 같이 요약됩니다. 마지막 4 비트 만 사용하고 숫자가 아닌 경우 9를 더합니다.


답변

아래 코드 블록을 시도해보십시오.

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

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

출력은 다음과 같습니다.

value x: 820 - 2080


답변

그래서 잠시 검색하고 strtol이 상당히 느리다는 것을 알게 된 후, 저는 제 자신의 함수를 코딩했습니다. 문자의 대문자에서만 작동하지만 소문자 기능을 추가하는 것은 문제가되지 않습니다.

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;
}

용법:

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

변환하려는 16 진수가 오프셋 1에서 시작하기 때문에 1이고 16 진수 길이이기 때문에 8입니다.

Speedtest (1.000.000 호출) :

strtol ~ 0.4400s
hexToInt ~ 0.1100s