我遇到了Crypto ++的Integer
类的一些问题。我正在使用最新版本5.6.2。整数到字符串转换问题
我试图整数转换成字符串用下面的代码:
CryptoPP::Integer i("12345678900987654321");
std::ostrstream oss;
oss << i;
std::string s(oss.str());
LOGDEBUG(oss.str()); // Pumps log to console and log file
输出似乎有多余的垃圾数据:
12345678900987654321.ÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««îþîþ
我,当我直接输出得到同样的事情到控制台:
std::cout << "Dec: " << i << std::endl; // Same result
此外,我不能得到精度或科学no工作。以下内容将输出相同的结果:
std::cout.precision(5); // Does nothing with CryptoPP::Integer
std::cout << "Dec: " << std::setprecision(1) << std::dec << i << std::endl;
std::cout << "Sci: " << std::setprecision(5) << std::scientific << i << std::endl;
最重要的是,足够多的数字打破了整个事情。
CryptoPP::Integer i("12345");
// Calculate i^16
for (int x = 0; x < 16; x++)
{
i *= i;
}
std::cout << i << std::endl; // Will never finish
最后我想要得到的东西,我可以用大Integer
号工作,并能输出以科学计数法的字符串。我没有提取Integer
库或根据需要修改它的问题,但我宁愿使用稳定的代码。
我做错了什么,或者有没有办法让我的工作正常?
显示LOGDEBUG的定义。听起来就像你在调用'printf'并传递从'ostrstream'返回的字符串对象而不是指向文本缓冲区的指针。由于没有进行任何调用来强制缓冲区被空终止,因此您可能会在文本之后看到垃圾。尝试'LOGDEBUG(oss.str()。c_str())' –
坦率地说,LOGDEBUG在这里不是问题。正如我的帖子所指出的,std :: cout产生相同的输出。我可以完全删除我的Urho3D的东西(包括LOGDEBUG)和std :: cout仍然会产生相同的问题。 – Thebluefish
*“除此之外,足够多的数字打破了整个事情” - 是的,这是记录的行为。确切的大小是*绝对值小于(256 ** sizeof(word))**(256 ** sizeof(int))* *。请参阅[Integer头文件](http://www.cryptopp.com/docs/ref/integer_8h_source.html)中的注释。即使是密码学,这个数字也是非常大的。也许你应该转向一个提供通用整数的库,如[GNU's Multiprecision Integer](https://gmplib.org/)(gmp)。 – jww