gpt4 book ai didi

c++ - SecByteBlock 到字符串转换错误

转载 作者:行者123 更新时间:2023-11-28 06:05:36 24 4
gpt4 key购买 nike

我必须在一个数据包中发送一个随机生成的数字 (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 转换成这两种格式之一...

最佳答案

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 的大小。 one 的原始声明是一个大小为 0 的数组,没有 内存块支持它。也就是说,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 是荒谬的。

关于c++ - SecByteBlock 到字符串转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32459580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com