在C中以256位数组将大十进制输入转换为十六进制输出

时间:2013-02-15 14:54:52

标签: c arrays

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

例如: decimal = 1234567891012 ---- hexa = 00 00 00 02 00 00 00 65 00 6b 42 48 71 fb 08 44

最后四个vales(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;
}

2 个答案:

答案 0 :(得分:1)

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

发生这种情况是因为您使用unsigned int来存储小数,这只是您计算机上的32位。使用unsigned long存储大的小数。

unsigned long decimal = 12345678901012L;

对于16字节小数,请使用GMP Lib

---编辑---

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

答案 1 :(得分:0)

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

首先:

uint8_t buf[] = {0};

不好。您需要为数组指定一个大小(或使其动态化),这就是您在访问元素时获得“垃圾”的原因。现在,我们可以给它任意大小:

uint8_t buf[100] = {0};

修复了“垃圾”值问题。

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

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

但是,您应该针对limits验证您的输入。确保用户输入的内容在LONG_MAX或INT_MAX范围内或您拥有的任何类型。