如何打乱结构中的位?

How do I scramble the bits in a struct?

我有一对 pack/unpack 对数据结构进行操作的函数。

为了有效地对它们进行单元测试,
我想把这个结构变成一个随机状态,然后验证加壳和解壳returns是原来的结构。它可能看起来像这样:

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

按照 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();
    }
}