在 c++11 中生成随机字节
Random bytes generation in c++11
我已经编写了一个函数来在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
类型数组,就会发现
uint8_t data[16];
std::generate(std::begin(data), std::end(data), std::ref(bytes)); //and pass this array in `generate()`.
那么只剩下错误 7。 有什么解决方案吗?
这里的问题是,即使你的函数看起来像
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);
}
编译得很好
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 以随机可重现的顺序生成非重复字节的快速方法
- 在 c++11 中生成随机字节
- 生成十六进制随机 16 字节数组
- 如何生成伪随机 32 字节字符串以用作加密哈希函数中的盐?
- 使用 libsodium 为 iOS 构建 zeromq,随机字节错误
- 这是在 C 或 C++ 中生成随机字节数组的好方法吗?
- C++以二进制流的形式读取文件,在中间随机跳过字节
- C++中用于字节块的随机R/W的基本文件I/O
- 在c++ 11/14中有效地生成随机数据字节
- 如何清理(用随机字节覆盖)std::string内部缓冲区