Проблема здесь в том, что даже если ваша функция выглядит как
void generateInitVector(uint8_t IV_buff[16])
То, чем она является на самом деле, благодаря массиву, распадающемуся в указатель, равно
void generateInitVector(uint8_t * IV_buff)
Итак, потому что выесть указатель, вы не можете использовать std::begin
и std::end
.Что вам нужно сделать, это передать массив по ссылке, чтобы сохранить его в виде массива.Это выглядит как
void generateInitVector(uint8_t (&IV_buff)[16])
, и теперь вы можете использовать std::begin
и std::end
, и вы сохраняете информацию о размере массива.Вы даже можете сделать его универсальным для размера, используя шаблон, такой как
template<std::size_t N>
void generateInitVector(uint8_t (&IV_buff)[N])
{
using bytes_randomizer = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, uint8_t>;
std::random_device rd;
bytes_randomizer bytes(rd);
std::generate(std::begin(IV_buff), std::end(IV_buff), std::ref(bytes));
}
. У вас также есть проблема с
bytes_randomizer bytes(rd);
std::independent_bits_engine
, ожидающая PRNG типа первого шаблонапараметр.Вы использовали std::default_random_engine
, который не совпадает с std::random_device
.Вам нужно изменить один из них, чтобы он соответствовал другому, чтобы он компилировался.Например:
template<std::size_t N>
void generateInitVector(uint8_t (&IV_buff)[N])
{
using bytes_randomizer = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, uint8_t>;
std::default_random_engine rd;
bytes_randomizer bytes(rd);
std::generate(std::begin(IV_buff), std::end(IV_buff), std::ref(bytes));
}
int main()
{
uint8_t data[16];
generateInitVector(data);
}
Компилируется просто отлично