Преобразование массива символов для обработки как шестнадцатеричный в C

Совсем недавно мне пришлось работать с C — обычно я работаю с Python и немного с Java — и столкнулся с некоторыми проблемами.

Я создал функцию, которая преобразует беззнаковое целое число с основанием 10 в массив символов, представляющий эквивалентный шестнадцатеричный код. Теперь мне нужно иметь возможность установить переменную с типом uint32_t в этот «шестнадцатеричный»; что я могу сделать, чтобы убедиться, что этот char[] рассматривается как фактическое шестнадцатеричное значение?

Код ниже:

int DecToHex(long int conversion, char * regParams[])
{    
    int hold[8];

    for (int index = 0; conversion > 0; index++)
    {
        hold[index] = conversion % 16;
        conversion = conversion / 16;
    }

    int j = 0;

    for (int i = 7; i > -1; i--)
    {
        if (hold[i] < 10 && hold[i] >= 0)
        {
            regParams[j] = '0' + hold[i];
        }
        else if (hold[i] > 9 && hold[i] < 16)
        {
            regParams[j] = '7' + hold[i];
        }
        else
        {
            j--;
        }
        j++;
    }
    return 0;
}

person IronMage    schedule 20.05.2015    source источник
comment
Вы не можете установить переменную типа uint32_t в строку. C имеет строгую типизацию, что означает, что вы не можете свободно преобразовать один тип в другой. Вы преобразовали двоичное значение в строку. Если вы хотите, чтобы это было двоичное значение, вам придется преобразовать его обратно. Но вы могли бы преобразовать uint32_t в шестнадцатеричную строку следующим образом: sprintf(hold, "%lX", conversion), хотя hold[8] не будет достаточно большим, чтобы вместить 0 терминатор, который есть в строках C.   -  person Weather Vane    schedule 20.05.2015
comment
Кстати, нет такой вещи, как base-10 unsigned int. Это просто двоичные биты. Разница между десятичным, двоичным, шестнадцатеричным и восьмеричным является просто человеческим решением относительно того, как они представлены в строковом формате (кроме представления BCD, которое не используется в языках высокого уровня).   -  person Weather Vane    schedule 20.05.2015


Ответы (1)


Вы должны просто использовать snprintf:

int x = 0xDA8F;
char buf[9];
snprintf(buf, sizeof(buf), "%X", x);   // Use %x for lowercase hex digits

Чтобы преобразовать шестнадцатеричное представление числа в int, используйте strtol (третий аргумент к нему позволяет указать базу), или, поскольку вы хотите назначить его типу данных unsigned, strtoul.

Код будет выглядеть примерно так:

char* HexStr = "8ADF4B";
uint32_t Num = strtoul(HexStr, NULL, 16);
printf("%X\n", Num);        // Outputs 8ADF4B
person user4520    schedule 20.05.2015
comment
Моя проблема не в преобразовании int -> char[], а в том, что мне нужно установить uint32_t равным этому char[]. - person IronMage; 20.05.2015
comment
@IronMage Вы не можете установить uint32_t равным строке. На самом деле в C нет такой вещи, как string, у вас есть только char*. Вам необходимо преобразовать строковое представление числа обратно в биты, чтобы иметь возможность присвоить его uint32_t. - person user4520; 20.05.2015
comment
Как преобразовать строку в форму, которую я могу присвоить uint32_t? - person IronMage; 20.05.2015