【发布时间】:2011-07-11 00:44:38
【问题描述】:
n.b.我知道以前在 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 外,此代码片段中的所有内容都有效)
【问题讨论】:
-
+1 表示一个很好的问题并在寻求帮助之前为作业付出了很多努力 - 我希望更多
homework问题具有类似的质量。 -
.. 以及对 输出 的出色思考!
-
"输出像 \377" --
\377是(char)-1。您的getHexValue例程返回一个负整数作为错误代码,但键入时返回一个char,然后您永远不会检查错误代码 - 这是双重错误。 -
您的代码中没有任何强制转换是必需的。不必要的强制转换是个坏主意,因为它们可以隐藏错误。