如何在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)。
如果有更好的方法来做到这一点,它仍然使用void asciiToHexadecimal(char inputChar, char *hexString)
函数,我是所有的耳朵, 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%9sn", *(asciiString + i), binaryString, hexString);
(这段代码中的所有内容除了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)
format %c
。)
当您使用介于0和9之间的数字调用getHexValue()
时,您将返回一个介于0和9之间的ASCII控制字符范围内的数字。 当您以10到15之间的数字调用getHexValue()
时,您将返回一个介于65和75之间的ASCII字母范围内的数字。
布道? 如果您在编写代码的同时编写测试,单元测试可以节省您的时间。
有些人喜欢先写测试。 虽然我从来没有遵守这种方法的纪律,但知道你必须编写测试会迫使你编写更容易测试的代码。 而且更容易测试的代码更少耦合(或“更多解耦”),这通常会导致更少的错误!
尽早且经常地写测试。 :)
更新 :在你包含你的输出代码后,我不得不对此评论:)
char* binaryString = (char*) malloc(8);
char* hexString = (char*) malloc(2);
asciiToBinary(*(asciiString + i), binaryString);
asciiToHexadecimal(*(asciiString + i), hexString);
printf("%6c%13s%9sn", *(asciiString + i), binaryString, hexString);
hexString
已被分配一个字节太小而不能成为C字符串 - 您忘记为ASCII NUL '