Как преобразовать двоичный файл в шестнадцатеричный с помощью сдвига битов / маскировки

#c #binary #hex #bit-shift #bitmask

#c #двоичный #шестнадцатеричный #битовый сдвиг #битовая маска

Вопрос:

Я пытаюсь преобразовать строковое представление 32-разрядного двоичного числа в строку, представляющую шестнадцатеричное значение этого числа в вызываемой функции hexConversion() . Для этого мне требуется использовать только базовое программирование на C (для циклов, базовых массивов) и битовый сдвиг / маскирование. В этом назначении используется двоичное представление, которое возвращается в виде массива из другой функции binaryConversion() .

У меня есть идея о том, как преобразовать 4-битные значения в их шестнадцатеричные значения, но я не понимаю, как на самом деле разбить 32-битное значение на меньшие и более работоспособные 4-битные значения.

Например, я мог бы захотеть изменить 11111111111111111111111111111111 на 1111 1111 1111 1111 1111 1111 1111 1111 , чтобы иметь возможность работать с каждым из них 1111 по отдельности для преобразования каждого в F

Комментарии:

1. Вы говорите, что вам нужно преобразовать 32-разрядное целое число, но, похоже, у вас есть строка значений или какой-то другой массив из 32 значений, а не 32-разрядное целое число. Пожалуйста, поясните. Может быть, покажите объявление hexConversion , чтобы мы могли видеть, какие типы данных вы используете. Когда вы говорите преобразовать в «шестнадцатеричное значение», вы также имеете в виду строку?

2. Это требует уточнения. Вы говорите 32-разрядное целое число, но показываете двоичное представление. Вы можете преобразовать его в шестнадцатеричный с помощью printf(), если это реальное целое число. printf(«%x», val)

3. Да, вы правы, виноват. binaryConversion() выдает мне строку из 32 значений, которая является репрезентативной для двоичного числа, и с помощью hexConversion() я надеюсь создать строку значений, представляющих шестнадцатеричное значение двоичного числа. Извините, если я неудачно сформулировал это.

Ответ №1:

«Базовый C», но, возможно, не то, что вы ищете…

 binaryConversion(const char *bits, char *buf, int len) {
    snprintf(buf, len, "%lx", strtol(bits, NULL, 2));
}
  

Более сложным решением, конкретно использующим битовые маски и сдвиги, может быть что-то вроде этого…

 binaryConversion(const char *bits, char *buf, int len) {
    const char *xdig = "0123456789ABCDEF";
    long val = strtol(bits, NULL, 2);
    int i;
    for (i = 0; i < 8;   i) {
        int nib = val amp; 0xf;
        if (len > i) buf[i] = xdig[nib];
        val = val << 4;
    }
}
  

Комментарии:

1. Здесь происходит довольно классическая раздача рыбы .