如何扰乱结构中的位?

时间:2016-03-10 05:43:31

标签: c++ random bits memset packing

我有一对pack/unpack函数可以在数据结构上运行。

为了有效地对它们进行单元测试,
我想将此结构置于随机状态,然后验证打包和解包返回原始结构。它可能看起来像这样:

for (int i = 0; i < LOTS_OF_TESTS; ++i){
    Struct s;
    randomize_bits(s);
    CHECK ( s == UnPack(Pack(s)) );
}

是否有一个采用泛型类型的函数,并将所有位随机化?

条件:
  - 结构中没有指针
  - 可能有基本类型
  - 可能有嵌套结构
  - 可能有阵列
  - 我不担心填充

我以为我可以使用memset的东西,
买我的尝试给我一个运行时异常。

template<typename T>
void randomize_bits(T & t){
    for (size_t i = 0; i < sizeof(t); ++i){
        std::memset((&t)+i,random_uchar(),1);
    }
}

1 个答案:

答案 0 :(得分:1)

正如Basile所建议的那样,这解决了我的问题,并正确地迭代了内存。

template<typename T>
void randomize_bits(T & t){
    for (size_t i = 0; i < sizeof(t); ++i){
        reinterpret_cast<unsigned char*>(&t)[i] = random_uchar();
    }
}