web-dev-qa-db-ja.com

16進文字列(char [])をintに変換しますか?

「0x1800785」などの値を含むchar []がありますが、値を指定する関数にはintが必要ですが、これをintに変換するにはどうすればよいですか?いろいろ調べましたが、答えが見つかりません。ありがとう。

71
kizyle502

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などの明示的なベースを指定することも可能ですが、冗長性を導入することはお勧めしません。)

183
user529758

このような何かが役に立つかもしれません:

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

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

読み取り man sscanf

19
saxi

または、独自の実装が必要な場合は、このクイック関数を例として作成しました。

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

それが文字列であると仮定すると、 strtol はどうですか?

9

以下のコードブロックを試してみてください。

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

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

出力は次のとおりです。

value x: 820 - 2080
4
Dig The Code

それで、しばらく検索して、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
3
mexikanoZ

私は同様のことをしました、それはあなたのために実際に働くのに役立つかもしれないと思います

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

ここでは、8文字の文字列のみを取得しています。 uに 'a'から 'f'に同様のロジックを追加して、同等の16進値を与えることができるようにしたい場合、私はそれをしていないので、必要ありません。

0
sairam singh

stdio.hを使用せずに16進数/ 10進数変換を行うためにライブラリを作成しました。使い方はとても簡単です:

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

最初の変換の前に、変換に使用される配列を次で初期化します。

void init_hexdec ();

ここにgithubのリンク: https://github.com/kevmuret/libhex/

0
kevmuret