c++ 用随机字节填充字节向量

nwnhqdif  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(182)

我想用随机或伪随机字节的数据填充std::vector<BYTE>。我已经在stackoverflow中编写了(换句话说,找到它)以下源代码,但它不能在我的Visual Studio中编译。

#include <Windows.h>
#include <vector>
#include <random>
#include <climits>
#include <algorithm>
#include <functional>

using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, BYTE>;

int main()
{
    random_bytes_engine rbe;
    std::vector<BYTE> data(1000);
    std::generate(data.begin(), data.end(), std::ref(rbe));
}

当我尝试编译上述代码Visual Studio给予我以下错误:
错误C2338注解:不允许字符、有符号字符、无符号字符、char8_t、int8_t和uint8_t消息传递
错误C2338 independent_bits_engine的模板参数无效:N4659 29.6.1.1 [兰德.req.genl]/1f需要无符号短整型、无符号整型、无符号长整型或无符号长整型消息之一。

rsaldnfx

rsaldnfx1#

UIntType参数不允许使用BYTE类型,该类型只是unsigned char的别名

template<class Engine, std::size_t W, class UIntType>
class independent_bits_engine;

标准[兰德.req.genl]/1.f规定:
在整个子条款[兰德]中,示例化模板的效果是:
...

  • 具有名为UIntType的模板类型参数的模板参数是未定义的,除非对应的模板参数是cv非限定的并且是unsigned shortunsigned intunsigned longunsigned long long之一。
w6lpcovy

w6lpcovy2#

Evg的答案是正确的。
如果你真的只想使用随机字节,我会使用一个自定义生成器函数,它可以生成[-128,127]或任何所需范围内的值。

#include <iostream>
#include <Windows.h>

#include <vector>
#include <random>
#include <algorithm>
#include <limits>

int main()
{
    std::random_device r;
    std::default_random_engine randomEngine(r());
    std::uniform_int_distribution<int> uniformDist(CHAR_MIN, CHAR_MAX);

    std::vector<BYTE> data(1000);
    std::generate(data.begin(), data.end(), [&uniformDist, &randomEngine] () {
        return (BYTE) uniformDist(randomEngine);

    });

    for (auto i : data) {
        std::cout << int(i) << std::endl;
    }
    return 0;
}

参考文献:

  1. https://en.cppreference.com/w/cpp/numeric/random
  2. https://en.cppreference.com/w/cpp/algorithm/generate
xqk2d5yq

xqk2d5yq3#

只需执行以下操作即可:

using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, 32, uint32_t>;

将引擎转换为一个32位随机数生成器,但使用它来初始化字节向量工作得很好。

相关问题