SecByteBlock转换为字符串转换错误

时间:2015-09-08 13:49:31

标签: c++ crypto++ libcrafter

我必须在数据包中发送随机生成的数字(rng),因此必须转换SecByteBlock。我使用libcrafterrng数组放入RawLayer数据包。

我跟着this answer;但它让我得到无效转换错误。

这是我使用的代码:

AutoSeededRandomPool prng;
SecByteBlock rng1;
prng.GenerateBlock( rng1, rng1.size() );

string rng1_str(reinterpret_cast<char const*>(rng1));

std::string rng1_str = std::string(rng1.data(), rng1.size());

Crafter::RawLayer number(rng1_str);

这两个想法都不起作用,都给了我:

error: invalid conversion from ‘CryptoPP::AllocatorWithCleanup<unsigned char>::pointer {aka unsigned char*}’
to ‘const char*’ [-fpermissive]
std::string rng1_str = std::string(rng1.data(), rng1.size());

由于RawLayer接受std::stringconst byte*作为构造函数,我想将SecBlockByte转换为这两种格式中的一种......

2 个答案:

答案 0 :(得分:1)

PRNG的输出可能具有嵌入式NULL,因此您无法使用常规C字符串操作对其数据进行操作。这意味着第一个陈述可能是错误的。

string rng1_str(reinterpret_cast<char const*>(rng1));

std::string rng1_str = std::string(rng1.data(), rng1.size());

我不确定你在使用第二个语句做了什么,但它需要像第一个语句一样进行转换(并且你可以取消分配):

std::string rng1_str(reinterpret_cast<const char*>(rng1.data()), rng1.size());

由于您说RawLayer接受构造函数std::stringconst byte*,您可以尝试:

SecByteBlock rng(16);
prng.GenerateBlock( rng, rng.size() );

Crafter::RawLayer number( rng.data(), rng.size() );

另外,请务必调整SecByteBlock的大小。一个原始声明是一个0大小的数组,其中 no 内存块支持它。也就是说,rng.size()将为0,只有以下内容:

SecByteBlock rng;

您还可以执行以下操作:

SecByteBlock rng;
// Make it 16-bytes in size, memory uninitialized
rng.New(16);

或者:

SecByteBlock rng;
// Make it 16-bytes in size, memory initialized to 0
rng.CleanNew(16);

如果你想真正想要并避免内存块的运行时分配,那么使用FixedSizeSecBlock

FixedSizeSecBlock<byte, 16> rng;

但这是一种更先进的技术,所以不要陷入困境。

我发现C / C ++不愿意在signed charunsigned char之间自动转换,因为它对我来说只是8位二进制数据(我理解语言规则的必要性)。但我认为这很荒谬我需要reinterpret_cast而不是static_cast

答案 1 :(得分:0)

由于目标是将SecByteBlock放入Crafter::RawLayer,我只需将其投入const byte* ......

以下几行做了。

SecByteBlock rng1;
prng.GenerateBlock( rng1, rng1.size() );

Crafter::RawLayer number(reinterpret_cast<const byte*>(rng1.data()), rng1.size());