我正在使用Cryptopp生成随机字符串。 这是代码:
const unsigned int BLOCKSIZE = 16 * 8;
byte pcbScratch[ BLOCKSIZE ];
// Construction
// Using a ANSI approved Cipher
CryptoPP::AutoSeededX917RNG<CryptoPP::DES_EDE3> rng;
rng.GenerateBlock( pcbScratch, BLOCKSIZE );
// Output
std::cout << "The generated random block is:" << std::endl;
string str = "";
for( unsigned int i = 0; i < BLOCKSIZE; i++ )
{
std::cout << "0x" << std::setbase(16) << std::setw(2) << std::setfill('0');
std::cout << static_cast<unsigned int>( pcbScratch[ i ] ) << " ";
str += pcbScratch[i];
}
std::cout << std::endl;
std::cout << str <<std::endl;
我在代码中添加了一个新的var:string str = ""
。
然后在for append中为每个结果添加字符串的一部分。
但我的输出很脏!我只看到奇怪的ASCII字符。
我该如何设置好字符串?
谢谢。
答案 0 :(得分:1)
您需要一些输出编码,例如
因为你看到的是原始二进制数据,解释为它是文本。随机字符是结果
AFAICT(谷歌)你应该可以使用这样的东西
#include <base64.h>
string base64encoded;
StringSource(str, true, new Base64Encoder(new StringSink(base64encoded)));
答案 1 :(得分:1)
将任意字节(字符串)附加到字符串的末尾将导致包含一些不可打印的字符:
http://en.wikipedia.org/wiki/Control_character
您没有提到您想要或期望的内容。您是否希望字符串与发送到std :: cout的字符串相同?如果是这样,您可以通过#include <sstream>
使用字符串流:
std::stringstream ss;
for( unsigned int i = 0; i < BLOCKSIZE; i++ )
{
ss << "0x" << std::setbase(16) << std::setw(2) << std::setfill('0');
ss << static_cast<unsigned int>(pcbScratch[i]);
}
str = ss.str();
答案 2 :(得分:0)
您还可以使用HexEncoder
内置的Crypto ++:
std::cout << "The generated random block is:" << std::endl;
string str = "0x";
StringSource ss(pcbScratch, BLOCKSIZE, true,
new HexEncoder(
new StringSink(str),
true, // uppercase
2, // grouping
" 0x" // separator
) // HexDecoder
); // StringSource
StringSource
&#39;拥有&#39; HexEncoder
,因此无需拨打delete
。