2013-05-11 121 views
1

我用C++c + +转换大数为十六进制

我做了一个在线转换大批这个值的

DECIMAL: 3712299789313814843 

我想将其转换为十六进制,我意识到了

hexadecimal value is  3384BCFD61CEB13B 

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

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

    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类,但我不知道如何在这种情况下使用它..

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

谢谢!!

回答

1

您将需要某种大型图书馆,如BigInteger(https://mattmccutchen.net/bigint/)。一个32位整数只能保存一个大约40亿左右的值(如果它是无符号的 - 如果它被签名的话只有20亿左右)。

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

编辑:此外,只是供参考,疲惫的在线转换器检查您的答案。许多在线转换器只使用32位整数,因此会给你一个错误的答案。

+1

有什么不对的64位整数? (a.k.a'int64_t'?) – qdii 2013-05-11 17:24:35

+0

从技术上来说,没有什么是错的64位int为OP指定的号码,但OP实际上即使在运行相当接近的与64号位的限制。无符号的64位int可以指望高达1.8 * 10^19。 OP处理的数量是3.7 * 10^18。作为溢出是一个数量级之内,OP会很好地去大的INT大小的情况下,他/她必须面对更大的数字。 – 2to1mux 2013-05-12 00:03:17

0

在你的情况下,你使用的int十进制是非常小的来处理这么大的数字。使用NTL与普通的int相同,所以你可以直接对它执行操作。同时代替while(scratch!= 0)使用while(十进制!= 0),这里decimal将是ZZ类型。

你可以查看这个链接的例子。

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

0

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

这样的图书馆代表你的大号码后,你就可以申请步骤转换为十六进制:

设N是您的号码:

  1. 初始化一个空字符串资源
  2. 计算N模16(提醒分部)
  3. 代表你在十六进制中获得的值为一个字符串:ex。10变为 “一”
  4. 结果附加到RES
  5. N = N/16(整数除法)从所述第二步骤
  6. 重复直到N变为0 -

我会给下面的例子:

#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()); 
    }