1

我得到了大量的这个值

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

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

谢谢!!

4

3 回答 3

1

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

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

编辑:另外,仅供参考,请不要使用在线转换器检查您的答案。许多在线转换器仅使用 32 位整数,因此会给您错误的答案。

于 2013-05-11T17:07:24.260 回答
0

在您的情况下,您使用的 int decimal 非常小,无法处理这么大的数字。使用 NTL 和普通的 int 一样,可以直接对它进行操作。也代替 while(scratch != 0) 使用 while(decimal != 0) 这里十进制将是 ZZ 类型。

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

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

于 2013-05-11T17:48:43.707 回答
0

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

用这样的库表示您的大数字后,您可以应用以下步骤转换为十六进制:

假设 N 是你的号码:

  1. 初始化一个空字符串res
  2. 计算N模16(除法的提示)
  3. 将您在十六进制中获得的值表示为字符串:例如。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());
    }
于 2017-06-07T12:59:11.043 回答