注意我知道这个问题以前在 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/