Преобразовать шестнадцатеричную строку (char []) в int?

У меня есть char [], который содержит значение, такое как «0x1800785», но функция, которой я хочу присвоить значение, требует int, как я могу преобразовать это в int? Я искал вокруг, но не могу найти ответ. Спасибо.

68 голосов | спросил kizyle502 14 PMpSat, 14 Apr 2012 22:58:20 +040058Saturday 2012, 22:58:20

9 ответов


0

Вы пробовали strtol()?

strtol - преобразовать строку в длинное целое число

Пример:

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

Если строковое представление числа начинается с префикса 0x, один must должен использовать 0 в качестве базы:

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

(Также возможно указать явное основание, например, 16, но я бы не рекомендовал вводить избыточность.)

ответил 14 PMpSat, 14 Apr 2012 23:01:19 +040001Saturday 2012, 23:01:19
0

Примерно так может быть полезно:

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

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

Прочитайте man sscanf

ответил saxi 14 PMpSat, 14 Apr 2012 23:14:20 +040014Saturday 2012, 23:14:20
0

Если предположить, что это строка, как насчет strtol ?

ответил James McLaughlin 14 PMpSat, 14 Apr 2012 23:01:20 +040001Saturday 2012, 23:01:20
0

Или если вы хотите иметь собственную реализацию, я написал эту быструю функцию в качестве примера:

/**
 * 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;
}
ответил radhoo 20 PM00000010000000731 2016, 13:19:07
0

Попробуйте приведенный ниже блок кода, он работает для меня.

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

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

Вывод:

value x: 820 - 2080
ответил Dig The Code 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 05 Sep 2014 12:41:57 +0400 2014, 12:41:57
0

Я сделал похожую вещь, думаю, это может помочь тебе это на самом деле работает для меня

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 символов. Если вы хотите, чтобы вы могли добавить аналогичную логику для 'a' к 'f', чтобы получить их эквивалентные шестнадцатеричные значения, я не сделал этого, потому что мне это не нужно.

ответил sairam singh 2 J000000Saturday16 2016, 08:14:07
0

Я создал библиотеку для преобразования в шестнадцатеричное /десятичное число без использования stdio.h. Очень прост в использовании:

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

Перед первым преобразованием инициализируйте массив, используемый для преобразования, с помощью:

 void init_hexdec ();

Вот ссылка на github: https://github.com/kevmuret/libhex/

ответил kevmuret 3 Maypm14 2014, 17:41:40
0

Используйте xtoi (stdlib.h). Строка имеет «0x» в качестве первых двух индексов, поэтому обрежьте val [0] и val [1], отправив xtoi & val [2].

xtoi( &val[2] );

ответил Corey Lakey 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 08 Sep 2016 17:59:01 +0300 2016, 17:59:01
0

Я знаю, что это действительно старо, но я думаю, что решения выглядели слишком сложными. Попробуйте это в 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 
ответил CHEWBAKKEE 21 J0000006Europe/Moscow 2018, 17:53:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132