Генерация случайных байтов в c ++ 11 - PullRequest
0 голосов
/ 31 мая 2018

Я написал функцию для генерации случайных байтов в массиве типа uint8_t, если только я не заполняю это объектом random_device, он работает нормально, но когда я заполняю, есть некоторые ошибки компилятора.

код:

#include <algorithm>
#include <random>
#include <functional>
#include <stdint>

void generateInitVector(uint8_t IV_buff[16])
{
    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));
}

ошибки компилятора:

1. error: no matching function for call to 'begin(uint8_t*&)'|

2. error: request for member 'begin' in '__cont', which is of non-class type 'unsigned char*'|

3. error: request for member 'begin' in '__cont', which is of non-class type 'unsigned char* const'|

4. error: no matching function for call to 'end(uint8_t*&)'|

5. error: request for member 'begin' in '__cont', which is of non-class type 'unsigned char*'|

6. error: request for member 'end' in '__cont', which is of non-class type 'unsigned char* const'|

7. error: 'class std::random_device' has no member named 'generate'|

Есть ловушка, что если я определяю массив типа uint8_t внутри th-функции

uint8_t data[16];
std::generate(std::begin(data), std::end(data), std::ref(bytes));  //and pass this array in `generate()`.

, то только ошибка7 осталось.Какие-нибудь решения для этого?

1 Ответ

0 голосов
/ 31 мая 2018

Проблема здесь в том, что даже если ваша функция выглядит как

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);
}

Компилируется просто отлично

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...