C ++将大数字转换为十六进制

时间:2013-05-11 17:02:56

标签: c++

我得到了大量的这个值

DECIMAL: 3712299789313814843

我想用C ++将其转换为十六进制

我进行了在线转换,我意识到了

hexadecimal value is     3384BCFD61CEB13B

我在网上找到了一些解决方案,我尝试转换,但它给了我这个:

string hex_value(int decimal)
{
  static const string hex_digits("0123456789ABCDEF");

  string hex;
  int scratch = decimal;

  while (scratch != 0)
  {
    hex += hex_digits[scratch % 16];
    scratch /= 16;
  }

  reverse(hex.begin(), hex.end());

  return hex;
}

input= hex_value(atoi(buffer.c_str()));



HEXA: 61CEB13B

我认为整数太小而无法发送数据..我确实使用NTL,即ZZ类但我不知道如何在这种情况下使用它..

任何人都可以指导我如何将这个大数字转换成十六进制..

谢谢!

3 个答案:

答案 0 :(得分:1)

您将需要某种大型库,例如BigInteger(https://mattmccutchen.net/bigint/)。一个32位整数只能容纳一个大约40亿左右的值(如果它是无符号的 - 如果签名则只有20亿左右)。

如果将scratch声明为BigInteger而不是int,那么您在问题中发布的解决方案将正常工作。

编辑:另外,仅供参考,厌倦了通过在线转换器检查您的答案。许多在线转换器只使用32位整数,因此会给你一个错误的答案。

答案 1 :(得分:0)

在你的情况下,你使用的int十进制是非常小的处理这么大的数字。使用NTL与常规int相同,因此您可以直接对其执行操作。而不是while(scratch!= 0)使用while(decimal!= 0)这里decimal将是ZZ类型。

您可以查看此链接以获取示例。

http://www.shoup.net/ntl/doc/tour-ex1.html

答案 2 :(得分:0)

我建议使用库gmp来表示大数字:它非常直观且非常简单。它主要用于C,但有一些C ++扩展使事情变得更容易。

使用这样的库代表您的大号后,您可以应用转换为十六进制的步骤:

假设N是您的号码:

  1. 初始化空字符串 res
  2. 计算N模16(分裂的提示)
  3. 将您在十六进制中获得的值表示为字符串:ex。 10变为“a”
  4. 将结果附加到 res
  5. N = N / 16(整数除法)
  6. 从第二步开始重复,直到N变为0 -
  7. 我将举几个例子:

        #include <gmp.h> //contains all the functions and types
        #include <gmpxx.h> //contains some classes for C++
        string toFormatFromDecimal(mpz_class t);
    
        int main()
        {
            mpz_class N = "3712299789313814843"; //string initialisation
            std::cout<<toFormatDecimal(N);
            return 0;
        }
    
        string toFormatFromDecimal(mpz_class t)//mpz_class is the C++ equivalent of mpz_t
        {
            static const char hexmap[] = {'0', '1', '2', '3', '4', '5', '6', '7',
                           '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    
            string res = "";
            mpz_t temp; //C variable to store a big number
            mpz_init_set_ui(temp, 0); //initialisation
            unsigned int pos;
             do {
                 pos = mpz_mod_ui(temp, t.get_mpz_t(), 16); //calculate the reminder: t%16
                 res = res+hexmap[pos] ;
                 t = t/16;
    
            } while ((mpz_cmp_ui(t.get_mpz_t(), 0) != 0));
    
            return string(res.rbegin(), res.rend());
        }