【问题标题】:Converting large decimal input to hexadecimal output in a 256 bit array in C在C中将大十进制输入转换为256位数组中的十六进制输出
【发布时间】:2013-02-15 14:54:51
【问题描述】:

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

例如: 十进制 = 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;
}

【问题讨论】:

  • 请发布您的代码。
  • 设置??这是什么意思?
  • random values 通常意味着您没有将数组初始化为有效的东西,所以它是垃圾。
  • @Aniket - OP 的意思是“四个”而不是“为”。最后 4 个字节是正确的。
  • 我闻到整数溢出的味道

标签: c arrays


【解决方案1】:

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

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

unsigned long decimal = 12345678901012L;

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

--- 编辑---

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

【讨论】:

    【解决方案2】:

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

    首先是这个:

    uint8_t buf[] = {0};
    

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

    uint8_t buf[100] = {0};
    

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

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

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

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

    【讨论】:

    • 当然,long long unsigned 只会为您可以轻松掌握的任何内容提供最多 64 位的数字。对于较大的数字,数字本身必须存储为多个部分 - 如上一个答案中建议的 GMP 会起作用,或者您可以手动编写一些代码将字符串转换为整数并将其转换为十六进制.
    猜你喜欢
    • 2015-08-10
    • 2017-11-05
    • 1970-01-01
    • 2021-06-26
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2014-03-19
    相关资源
    最近更新 更多