我必须在数据包中发送随机生成的数字(rng
),因此必须转换SecByteBlock
。我使用libcrafter
将rng
数组放入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::string
或const byte*
作为构造函数,我想将SecBlockByte
转换为这两种格式中的一种......
答案 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::string
或const 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 char
和unsigned 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());