我正在使用Crypto ++来满足其他加密需求;但是,我还需要将二进制信息存储为ascii文本。为此,我将Crypto ++的base 64过滤器的示例合成到下面的代码块中。
bool saveData(const unsigned char * buffer, size_t length)
{
int lenb64 = (ceil(length / 3.0) * 4) + 1;
unsigned char * temp_str = (unsigned char *)malloc(lenb64);
CryptoPP::ArraySource as(buffer, length, new CryptoPP::Base64Encoder(
new CryptoPP::ArraySink(temp_str, lenb64)));
//do something with temp_str.
free(temp_str); //Then free the tempstr.
//Return true if do something worked, else false.
}
我遇到的问题是,在此操作之后,temp_str仍然充满了垃圾。我环顾四周,除了上面所做的以外,找不到任何可以做任何其他事情的例子。有什么我想念的吗?
答案 0 :(得分:2)
CryptoPP::ArraySource
是CryptoPP::StringSource
的typedef
。 StringSource
相关构造函数的签名是:
StringSource(const byte *string,
size_t length,
bool pumpAll,
BufferedTransformation *attachment=NULL);
所以你的第三个参数是指向CryptoPP::Base64Encoder
的指针被强制转换为bool
,第四个参数是默认的NULL
。
要解决此问题,请执行以下操作:
CryptoPP::ArraySource(buffer, length, true,
new CryptoPP::Base64Encoder(
new CryptoPP::ArraySink(temp_str, lenb64)));