Как я могу преобразовать строку в номер ZZ?
Вопрос
я использую НТЛ-библиотека реализовать алгоритм шифрования/дешифрования Эль-Гамаля.Я дошел до того, что это работает, но алгоритм хочет, чтобы сообщение было преобразовано в целые числа, чтобы его можно было зашифровать.
Итак, если я ввожу число вроде 1234, все работает нормально, но как мне преобразовать строку C++ (std::string) в номер ZZ, а затем обратно из этого номера ZZ в строку?
ЛЕ:
ZZ это класс, который представляет большое число.
Бывший:18287348238476283658234881728316274273671623781254124517353
Итак, по сути, я хочу взять, например, «Hello World», запустить его посимвольно и получить ascii-код символов, чтобы получить число:«72 101 108 108 111 32 87 111 114 108 100»
И затем мне нужно преобразовать это число обратно в строку «Hello World».
Или, может быть, есть лучший способ.
Решение
Вот простой способ сделать это:
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
Другие советы
Вот ответ с сайта автора NTL:
В дополнение к перечисленным конверсиям существует общее преобразование из C-струны (т.е. const char *) к любому типу t, который реализован с использованием шаблонов с использованием оператора ввода >> для типа T.Так, например, вы можете написать
ZZ x = conv<ZZ>("99999999999999999999999");
Источник: http://www.shouup.net/ntl/doc/conversions.txt
Я попробовал, и это сработало отлично.
Безусловно, самое простое решение — осознать, что вы можете конвертировать char
s для unsigned int
песок unsigned int
s для ZZ
цифры.Затем обработайте строку как число по основанию 256.Например, "abc" будет выглядеть так: 256*"ab" + "c" или 65536 * "a" + 256 * "b" + "c" или ((ZZ(unsigned('a')*256) + ZZ(unsigned('b'))*256) + ZZ(unsigned('c'))
,