3

我正在使用 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 字符。我怎样才能很好地设置字符串?

谢谢你。

4

3 回答 3

1

你会想要一些输出编码,例如

  • base64
  • 十六进制

因为您看到的是原始二进制数据,被解释为文本。随机字符是结果

AFAICT(谷歌)你应该能够使用这样的东西

#include <base64.h>

string base64encoded; 
StringSource(str, true, new Base64Encoder(new StringSink(base64encoded)));
于 2011-10-30T23:51:18.743 回答
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();
于 2011-10-30T23:53:17.847 回答
0

您还可以使用 Crypto++ 的内置HexEncoder

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拥有” HexEncoder,因此无需调用delete

于 2014-04-17T06:13:08.493 回答