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

标签 c hex decimal

注意我知道这个问题以前在 StackOverflow 上以各种不同的方式和情况被问过,但搜索我寻求的答案并不能完全帮助我的具体案例。因此,虽然这最初看起来像是一个问题的副本,例如 How can I convert an integer to a hexadecimal string in C?给出的答案是准确的,但对我没有用。

我的问题是如何手动将十进制整数转换为十六进制字符串。我知道 stdlib.h 和 printf 有一些技巧,但这是一项大学任务,我需要手动完成(教授的命令)。但是,我们可以寻求帮助。

使用很好的旧“除以 16 并将余数转换为十六进制并反转值” 获取十六进制字符串的方法,但我的代码中一定有一个大错误,因为它不是还给我,例如十进制值“188”的“BC”。

假设算法永远不需要为大于 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 的值)。

如果有更好的方法来做到这一点,它仍然使用 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);

(除了 hexString 之外,此代码片段中的所有内容均有效)

最佳答案

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);
}

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

当您使用 0 到 9 之间的数字调用 getHexValue() 时,您会在 ASCII 中返回一个 0 到 9 之间的数字。控制字符范围。当您使用 10 到 15 之间的数字调用 getHexValue() 时,您将返回一个 65 到 75 之间的 ASCII 字母范围内的数字。

布道? Unit testing如果您在编写代码的同时编写测试,可以节省小时的时间。

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

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

更新:包含输出代码后,我也不得不对此发表评论:)

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 被分配了一个字节,太小而不能成为 C 字符串——您忘记为 ASCII NUL '\0' 字符留出空间。如果您通过 %c 格式说明符打印 hexString,或者使用 memcpy(3) 构建更大的字符串,可能没问题,但是您的 printf() 调用将 hexString 视为字符串。

一般来说,当你看到一个

char *foo = malloc(N);

call, be afraid -- C 成语是

char *foo = malloc(N+1);

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

关于c - 如何在C中手动将十进制值转换为十六进制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231504/

相关文章:

c - 环绕整数的最优雅方式

c - 当我必须指定内存大小时,malloc 数组和常规数组之间有什么区别?

algorithm - 将十进制数转换为二进制数

c - 为什么C程序中int 070的输出是56?

c - (*pointer)[] 和 *pointer 有什么区别?

c - TerminateThread() 在终止线程时返回错误

rust - 是否有以十六进制表示法声明字 rune 字的语法?

c - 读取十六进制 (Intel) C 中的扩展线性地址记录

java - Java中如何将十六进制字节转换为Unicode

c++ - 将十六进制转换为十进制 C++