因此,我正在研究一个基本的RSA解密程序,并且试图找出如何在字符串和ZZ之间进行转换。我看了以下问题:How can i convert a string into a ZZ number?,但是我有点困惑,那里的答案对我没有用。我的代码:

fromBase()
{
   string message = "hello world";
   ZZ number (INIT_VAL, message.c_str());
   cerr << number;
}

给我以下输出。
bad ZZ input
Aborted

因此,我认为没什么大不了的,我只是尝试查找INIT_VAL应该是什么,这应该让我知道在哪里查看。但是没有运气,我找不到任何看起来像它的东西。我也使用INIT_VAL_STRUCT对其进行了修正,并收到以下错误:
base.cpp: In function âNTL::ZZ fromBase(std::string)â:
base.cpp:24: error: âmessageâ is not a type
base.cpp:24: error: expected â,â or â...â before â.â token

最后,我尝试了这里发布的解决方案:Regarding create a NTL class type认为我可以尝试某种类型转换。这是我的代码:
ZZ fromBase(string message)
{
   ZZ x;
   x = conv<ZZ>(message);
   return x;
 }

这给了我以下几点:
g++ base.cpp -lntl
base.cpp: In function âNTL::ZZ fromBase(std::string)â:
base.cpp:19: error: expected primary-expression before â>â token

好像我没有指定类型。

总而言之,我知道INIT_VAL是一个常量,但似乎没有用。我感觉我刚刚断开连接,但是要找到它并不容易。任何帮助将不胜感激,并且NTL的任何引用将不胜感激。抱歉,很长的帖子!

(此外,从我所见,NTL的文档记录很少,您是否有任何站点可以帮助图书馆的新手?)

最佳答案

您想要将实际上包含非数字字符的字符串转换为数字。

字符串没有规范编号,因此您不能一步一步完成。 C++可以为您提供一个字符编号,即ascii编号。您可以使用此函数来获取字符串的ascii号:

ZZ stringToNumber(string str)
{
    ZZ number = conv<ZZ>(str[0]);
    long len = str.length();
    for(long i = 1; i < len; i++)
    {
        number *= 128;
        number += conv<ZZ>(str[i]);
    }

    return number;
}

您可以通过此函数返回字符串
string numberToString(ZZ num)
{
    long len = ceil(log(num)/log(128));
    char str[len];
    for(long i = len-1; i >= 0; i--)
    {
        str[i] = conv<int>(num % 128);
        num /= 128;
    }

    return (string) str;
}

如果您有像öß这样的非ascii字符,则必须使用另一种将字符转换为数字的方式。(但我不知道这是如何工作的)

09-04 00:23
查看更多