如何将CryptoPP :: Integer转换为char *

时间:2014-09-17 10:17:04

标签: c++ visual-c++ crypto++

我想将myVar从CryptoPP:Integer转换为char*或转换为String: 代码如下:

CryptoPP::Integer myVar = pubKey.ApplyFunction(m);
std::cout << "result: " << std::hex << myVar<< std::endl;

我一直在互联网上搜索CryptoPP:Integerchar*,但我找不到运气。所以,要么将CryptoPP:Integer转换为char*要么全部都是问题,要么我在C ++中对CryptoPP:Integer类型的理解不是很清楚。

有人能帮助我吗?

4 个答案:

答案 0 :(得分:5)

使用Boost:

boost::lexical_cast<std::string>(myVar);

C ++ 98:

std::ostringstream stream;
stream << myVar;
stream.str();

答案 1 :(得分:5)

除了问题所暗示的明确支持CryptoPP::Integer之外,我不知道更多关于<<的一种方法是使用std::stringstream

std::stringstream ss;
ss << std::hex /*if required*/ << myVar;

使用std::string提取基础std::string s = ss.str();。然后,只要s.c_str()在范围内,您就可以使用const char*访问s缓冲区。一旦调用并依赖s的结果作为行为,并且随后依赖于该结果 undefined ,请不要以任何方式更改c_str()

有更简洁的C ++ 11解决方案,但这需要您(和我)更多地了解该类型。

答案 2 :(得分:2)

如果CryptoPP::Integer可以发送到std::cout之类的输出流(正如您的代码似乎建议的那样),那么您可以使用std::ostringstream

#include <sstream>  // For std::ostringstream
....

std::string ToString(const CryptoPP::Integer& n)
{
    // Send the CryptoPP::Integer to the output stream string
    std::ostringstream os;
    os << n;    
    // or, if required:
    //     os << std::hex << n;  

    // Convert the stream to std::string
    return os.str();
}

然后,如果您有std::string个实例,则可以使用 const char* 将其转换为std::string::c_str()
(但我认为在C ++代码中,你应该使用像std::string这样的安全字符串类,而不是原始的C风格字符指针。)


<强> PS
我假设CryptoPP::Integer int的普通typedef。
如果您想将int转换为std::string,那么您可能只想使用C ++ 11 std::to_string()

答案 3 :(得分:2)

根据您的需要,有几种不同的方法可以做到这一点。在这种情况下,char*没有提供足够的信息。

以下是使用插入运算符时的结果:

byte buff[] = { 'H', 'e', 'l', 'l', 'o' };
CryptoPP::Integer n(buff, sizeof(buff));

cout << "Oct: " << std::oct << n << endl;
cout << "Dec: " << std::dec << n << endl;
cout << "Hex: " << std::hex << n << endl;

结果是:

$ ./cryptopp-test.exe
Oct: 4414533066157o
Dec: 310939249775.
Hex: 48656c6c6fh

但是,如果你想获得原始字符串&#34;你好&#34; (re:你的Raw RSA项目):

byte buff[] = { 'H', 'e', 'l', 'l', 'o' };
CryptoPP::Integer n(buff, sizeof(buff));

size_t len = n.MinEncodedSize();
string str;

str.resize(len);
n.Encode((byte *)str.data(), str.size(), Integer::UNSIGNED);

cout << "Str: " << str << endl;

结果是:

$ ./cryptopp-test.exe
Str: Hello

但是,如果您只想要Integer中使用的字符串,那么:

Integer i("11111111111111111111");    
ostringstream oss;

oss << i;    
string str = oss.str();

cout << str << endl;

结果是:

$ ./cryptopp-test.exe
1111111111111111111.