如何在C中手动将十进制值转换为十六进制字符串?

Ash*_*Ash 7 c hex decimal

我知道这个问题之前已经在各种不同的方式和情况下被问到了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;
   }
}
Run Code Online (Sandbox Code Playgroud)

char *hexString是指针,我需要输出到屏幕(最终)的字符的字符串.char inputChar我需要转换为十六进制的参数(这就是我永远不需要将值转换为256的原因).

如果有一个更好的方法来执行此操作,仍然使用该void asciiToHexadecimal(char inputChar, char *hexString)函数,我都是耳朵,除此之外,我的调试似乎表明值是正常的,但输出结果\377不是预期的十六进制字母数字表示.

对不起,如果问题本身(或代码)有任何术语或其他问题,我仍然是C世界的新手.

更新: 我刚刚想到,在打印时显示值的方式可能是相关的,而不是故障的转换.这里是:

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);
Run Code Online (Sandbox Code Playgroud)

(此代码片段中的所有内容都可以使用除外hexString)

sar*_*old 2

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);
}
Run Code Online (Sandbox Code Playgroud)

您可能希望打印出为您感兴趣的每个值调用此例程所获得的字符。:)(printf(3)格式%c。)

当您getHexValue()使用 0 到 9 之间的数字进行调用时,您将返回ASCII控制字符范围内 0 到 9 之间的数字。当您使用getHexValue()10 到 15 之间的号码进行呼叫时,您将返回 65 到 75 之间的 ASCII 字母范围内的号码。

讲道?如果您在编写代码的同时编写测试,单元测试可以节省您数小时的时间。

有些人喜欢先编写测试。虽然我从来没有长期坚持这种方法的纪律,但知道必须编写测试将迫使您编写更容易测试的代码。更容易测试的代码耦合度较低(或“更加解耦”),这通常会导致更少的错误!

尽早并经常编写测试。:)

更新:在您包含输出代码后,我也必须对此发表评论:)

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);
Run Code Online (Sandbox Code Playgroud)

hexString已分配的一个字节太小,无法成为 C 字符串——您忘记为 ASCII NUL'\0'字符留出空间。如果您hexString通过%c格式说明符进行打印,或者使用 构建更大的字符串memcpy(3),可能没问题,但您的printf()调用被视为hexString字符串。

一般来说,当你看到一个

char *foo = malloc(N);
Run Code Online (Sandbox Code Playgroud)

打电话,害怕——C 习惯用法是

char *foo = malloc(N+1);
Run Code Online (Sandbox Code Playgroud)

+1是你向其他人(以及两个月后的你自己)发出的信号,表明你已经为 NUL 留出了空间。如果您将其隐藏+1在另一个计算中,那么您就错过了记住每次阅读代码时都可以捕获这些错误的模式的机会。(老实说,两天前我就通过这个确切的模式在SO上找到了其中一个。:)