我得到了大量的这个值
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类但我不知道如何在这种情况下使用它..
任何人都可以指导我如何将这个大数字转换成十六进制..
谢谢!
答案 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类型。
您可以查看此链接以获取示例。
答案 2 :(得分:0)
我建议使用库gmp来表示大数字:它非常直观且非常简单。它主要用于C,但有一些C ++扩展使事情变得更容易。
使用这样的库代表您的大号后,您可以应用转换为十六进制的步骤:
假设N是您的号码:
我将举几个例子:
#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());
}