Преобразование строки NTL в ZZ и преобразование ZZ в строку

Итак, я работаю над базовой программой расшифровки RSA и пытаюсь понять, как преобразовать строку в ZZ. Я посмотрел на следующий вопрос: Как я могу преобразовать строку в число ZZ? Однако я немного запутался, и ответ там не сработал для меня. Мой код:

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

Наконец, я попробовал решение, опубликованное здесь: что касается создания типа класса NTL, думая, что я мог бы попробовать приведение типов. Вот мой код:

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 довольно плохо документирован, из того, что я видел, есть ли у вас сайты, которые могут помочь новичку в библиотеке?)

1 ответ

Вы хотите преобразовать строку, которая на самом деле содержит не числовые символы в число.

Канонического номера строки не существует, поэтому вы не можете сделать это за один шаг. 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, такие как ö или же ß Вы должны использовать другой способ преобразования символа в число.(Но я не знаю, как именно это работает)

Другие вопросы по тегам