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


4 Answers

このようなものは役に立ちます:

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

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

man sscanfを読む

Question

私は "0x1800785"のような値を含んでいるchar []を持っていますが、値にintを必要とする関数をどのようにintに変換できますか? 私は周りを検索したが、答えを見つけることができない。 ありがとう。




私はこれが本当に古かったことを知っていますが、解決策が複雑すぎると思います。 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 



stdio.h使わずに16進/ 10進変換を行うためにlibrairyを作った。 非常に使いやすい:

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

最初の変換の前に、変換に使用される配列を初期化する:

void init_hexdec ();

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




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

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



だから、しばらくして検索して、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);

1は、変換する16進数はオフセット1から始まり、8進数の長さであるため8です。

スピードテスト(1.000.000コール):

strtol ~ 0.4400s
hexToInt ~ 0.1100s



Related



Tags

c   char   int