SecByteBlock к ошибкам преобразования строки

Я должен отправить случайно сгенерированный номер (rng) в пакете, и, таким образом, должны преобразовать SecByteBlock, я использую libcrafter класть rng массив в RawLayer пакет.

Я последовал за этот ответ; но это заставляет меня неверное преобразование ошибка.

Вот код, который я использую:

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

Решение

Вывод 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 с нет блок памяти, поддерживающий его. То есть, 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

Другие решения

Так как целью было поставить SecByteBlock в Crafter::RawLayerЯ просто должен был бросить его в const byte*

Следующие строки делают это.

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

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

По вопросам рекламы [email protected]