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

Posted

技术标签:

【中文标题】在C中将大十进制输入转换为256位数组中的十六进制输出【英文标题】:Converting large decimal input to hexadecimal output in a 256 bit array in C 【发布时间】: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 个字节是正确的。 我闻到整数溢出的味道 【参考方案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 会起作用,或者您可以手动编写一些代码将字符串转换为整数并将其转换为十六进制.

以上是关于在C中将大十进制输入转换为256位数组中的十六进制输出的主要内容,如果未能解决你的问题,请参考以下文章

用C语言编写程序,输入任意一个十进制的三位数,将它分别转化为五进制、八进制和十五进制?

十六进制数转十进制数怎么转换?

c++两个自然数(输入的十进制数转换为二进制时,两个数的位数相同。) 输出:有效则有效,无效则无效

在 C 代码中将 char 数组元素转换为等效的十六进制

在 C 中将字符转换为二进制

如何在C ++中将二进制转换为十六进制