Я должен отправить случайно сгенерированный номер (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
в один из этих двух форматов …
Вывод 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
,
Так как целью было поставить SecByteBlock
в Crafter::RawLayer
Я просто должен был бросить его в const byte*
…
Следующие строки делают это.
SecByteBlock rng1;
prng.GenerateBlock( rng1, rng1.size() );
Crafter::RawLayer number(reinterpret_cast<const byte*>(rng1.data()), rng1.size());