【问题标题】:How can i convert a string into a ZZ number?如何将字符串转换为 ZZ 数字?
【发布时间】:2023-03-04 10:11:01
【问题描述】:

我正在使用NTL library 来实现 ElGamal 加密/解密算法。 我已经知道它正在工作,但算法希望将消息转换为整数,以便对其进行加密。
因此,如果我输入一个像 1234 这样的数字,一切正常,但是我如何才能将 C++ 字符串(std::string)转换为 ZZ 数字,然后从该 ZZ 数字转换回字符串?

LE

ZZ 这是一个代表大数的类。
例如:18287348238476283658234881728316274273671623781254124517353

所以基本上我希望以“Hello World”为例,逐个字符地运行它并获取字符的 ascii 代码,所以我会得到一个数字:“72 101 108 108 111 32 87 111 114 108 100"
然后我需要将此数字转换回字符串“Hello World”

或者也许有更好的方法。

【问题讨论】:

  • ZZ 号是多少?坦白说,我试过 Google 找不到它
  • ZZ 是 NTL 的无限精度整数类。

标签: c++ ntl elgamal


【解决方案1】:

这是来自 NTL 作者网站的答案:

除了列出的转换之外,还有一个通用转换 从 C-strings(即 const char *)到任何类型 T,即 使用类型 T 的输入运算符 >> 使用模板实现。 因此,例如,您可以编写

    ZZ x = conv<ZZ>("99999999999999999999999");

来源:http://www.shoup.net/ntl/doc/conversions.txt

我试过了,效果很好。

【讨论】:

    【解决方案2】:

    这是一个简单的方法:

    std::string str("1234567890");
    NTL::ZZ number(NTL::INIT_VAL, str.c_str());
    

    现在请注意:

    std::cout << str << std::endl; // prints 1234567890
    std::cout << number << std::endl; // prints 1234567890
    

    【讨论】:

      【解决方案3】:

      到目前为止,最简单的解决方案是意识到您可以将chars 转换为unsigned ints,并将unsigned ints 转换为ZZ 数字。然后将字符串视为 base-256 数字。例如,“abc”将是 256*“ab” + “c”,或 65536 * “a” + 256 * “b” + “c”,或 ((ZZ(unsigned('a')*256) + ZZ(unsigned('b'))*256) + ZZ(unsigned('c'))

      【讨论】:

      • 在另一端,当我有数字时如何将其转换回字符串?
      • 迭代 nextchar=val % 256;val = val / 256; 直到 val 为 0。诚然,这会反向构建字符串,但这只是反转字符串的情况。
      • 是的——你可以选择一次,无论你想要小端还是大端,其他转换只需要匹配。两种字节序同样有效,匹配您的平台约定是有意义的。
      • 正是我想要的。奇迹般有效。谢谢 MSalters 和 vatine
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多