在C中从长转换为十六进制?

时间:2014-05-13 00:10:14

标签: c

我有这段代码

char binary[] = "0001001010000011";
long number = strtol(binary, NULL, 16);
printf("%x", number);

我想将字符串转换为十六进制数字。答案是1283,但我得到DF023BCF我做错了什么?

2 个答案:

答案 0 :(得分:4)

您指定给strtol的基础是用于解析输入的基础,而不是输出(而是由%x指定)。 IOW,该代码告诉strtol解析0001001010000011,好像它是一个十六进制数字(顺便说一下,它会导致溢出)。

答案 1 :(得分:3)

strtol的最后一个参数是您要转换的基础。由于您提供的是二进制编码字符串,因此应指定基数为2的转换。

这是正确的代码:

char binary[] = "0001001010000011";
long number = strtol(binary, NULL, 2);
printf("%x", number);

我还建议二进制数通常不会被签名(特别是当长度为17位时),因此,您可能希望使用函数的无符号版本strtoul(),如下所示。最后,当printf将数字转换为十六进制格式时,使用前导0x标记指示十六进制可能是个好主意。在您的情况下,答案是0x1283,但将此数字显示为1283可以很容易地将其混淆为十进制数。这两条建议如下所示。

const char binary[] = "0001001010000011";
unsigned long number = strtoul(binary, NULL, 2);
printf("0x%x", number);