如何打乱结构中的位

How do I scramble the bits in a struct?

本文关键字:结构 何打乱      更新时间:2023-10-16

我有一对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);
    }
}

正如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();
    }
}