0

我编写了一个代码,用于将基于使用输入的大数转换为十六进制数。但是,当打印结果时,数字的唯一部分被转换为十六进制,并且数组中还有其他随机值。

例如:十进制 = 1234567891012 ---- 十六进制 = 00 00 00 02 00 00 00 65 00 6b 42 48 71 fb 08 44

最后四个值 ( 71 FB 08 44) 是正确的十六进制值,但其他值不正确

我正在使用 uint8_t buf[];

代码:

int main()
{
  uint8_t buf[] = {0};

 long int i,a;

      printf("Enter Number: ");
      scanf("%d", &buf);

      printf("\n");
      printf("Input #: ");

      /* put a test vector */
      for (i = 15; i >= 0; i--)
         {
         printf("%02x ", buf[i]);
          }
           printf("\n\n");

          printf("\n\n");

      printf("%d\n",sizeof(buf));


    system("pause");
    return 0;
}
4

2 回答 2

1

免责声明:由于您没有提供源代码,我将假设一些事情:

发生这种情况是因为您曾经unsigned int存储小数,它仅在您的计算机上是 32 位的。使用 aunsigned long存储那么大的小数。

unsigned long decimal = 12345678901012L;

对于 16 字节十进制,使用GMP Lib

- - 编辑 - -

您必须使用scanf("%lu", &decimal)存储成长小数。scanf("%d", &decimal) 仅复制您机器上可能是 32 位的“integer(signed)”!

于 2013-02-15T15:03:55.673 回答
0

发布代码后,问题变得更加明显:

首先这个:

uint8_t buf[] = {0};

是没有好处。您需要为数组分配大小(或使其成为动态),这就是为什么当您访问元素时会得到“垃圾”。现在,我们可以给它一个任意大小:

uint8_t buf[100] = {0};

这解决了“垃圾”值问题。

第二个问题是您的扫描是否期望正常int大小的值:"%d"您需要告诉它寻找更大的值,例如:

scanf("%llu", &buf[0]); 

不过,您应该根据限制验证您的输入。确保用户输入的内容在 LONG_MAX 或 INT_MAX 或您拥有的任何类型的范围内。

于 2013-02-15T15:12:45.190 回答