Как вручную преобразовать десятичное значение в шестнадцатеричную строку в C?

nb Я знаю, что этот вопрос задавался в StackOverflow раньше разными способами и при различных обстоятельствах, но поиск ответа, который я ищу, не совсем помогает в моем конкретном случае. Итак, хотя изначально это выглядит как дубликат такого вопроса, как Как мне преобразовать целое число в шестнадцатеричную строку на языке C? , приведенные ответы точны, но бесполезны для меня.

Мой вопрос как преобразовать десятичное целое число в шестнадцатеричную строку вручную. Я знаю, что с stdlib.h и printf есть некоторые хитрости, но это задача колледжа, и мне нужно делать это вручную (приказы профессора). Однако нам разрешено обращаться за помощью.

Используя старый добрый метод «разделить на 16 и преобразовать остаток в шестнадцатеричный и перевернуть значения» метод получения шестнадцатеричной строки, но в моем коде должна быть большая ошибка, так как он не возвращает меня, например «BC» для десятичного значения «188».

Предполагается, что алгоритму НИКОГДА не нужно будет находить шестнадцатеричные значения для десятичных знаков большего размера чем 256 (или FF). Хотя передача параметров может быть неоптимальной или нежелательной, нам сказали использовать именно это (хотя мне разрешено изменять функцию getHexValue, поскольку я написал ее сам).

Это то, что у меня есть до сих пор. :

/* Function to get the hex character for a decimal (value) between
 * 0 and 16.  Invalid values are returned as -1.
 */
char getHexValue(int value) 
{
   if (value < 0) return -1;
   if (value > 16) return -1;
   if (value <= 9) return (char)value;
   value -= 10;
   return (char)('A' + value);
}


/* Function asciiToHexadecimal() converts a given character (inputChar) to
 * its hexadecimal (base 16) equivalent, stored as a string of
 * hexadecimal digits in hexString. This function will be used in menu
 * option 1.
 */
void asciiToHexadecimal(char inputChar, char *hexString)
{
   int i = 0;
   int remainders[2];
   int result = (int)inputChar;
   while (result) {
      remainders[i++] = result % 16;
      result /= (int)16;
   }
   int j = 0;
   for (i = 2; i >= 0; --i) {
      char c = getHexValue(remainders[i]);
      *(hexString + (j++)) = c;
   }
}

char * hexString - это указатель на строку символов, которую мне нужно вывести на экран (в конечном итоге). Параметр char inputChar , который мне нужно преобразовать в шестнадцатеричный (поэтому мне никогда не нужно преобразовывать значения, превышающие 256).

Если есть лучший способ сделать это, Мне просто пришло в голову, что может быть уместно опубликовать способ отображения значения в случае, если это печать, а не преобразование, которое является ошибочным. Вот он:

char* binaryString = (char*) malloc(8);
char* hexString = (char*) malloc(2);
asciiToBinary(*(asciiString + i), binaryString);
asciiToHexadecimal(*(asciiString + i), hexString);
printf("%6c%13s%9s\n", *(asciiString + i), binaryString, hexString);

(В этом фрагменте кода работает все, кроме hexString )

7
задан Community 23 May 2017 в 11:43
поделиться