C++ 如何对结构中的位进行置乱?
我有一对C++ 如何对结构中的位进行置乱?,c++,random,bits,memset,packing,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)) ); } for(int i=0;i
pack/unpack
函数,它们在数据结构上运行
为了有效地对它们进行单元测试,我想将此结构置于随机状态,然后验证打包和解包是否返回原始结构。它可能看起来像这样:
for (int i = 0; i < LOTS_OF_TESTS; ++i){
Struct s;
randomize_bits(s);
CHECK ( s == UnPack(Pack(s)) );
}
for(int i=0;i
是否有一个函数采用泛型类型,并将所有位随机化?
条件:-结构中没有指针
-可能有基本类型
-可能存在嵌套结构
-可能存在数组
-我不关心填充
我想我可以用一些东西,
“购买我的尝试”会给我一个运行时异常
template<typename T>
void randomize_bits(T & t){
for (size_t i = 0; i < sizeof(t); ++i){
std::memset((&t)+i,random_uchar(),1);
}
}
模板
无效随机化位(T&T){
对于(大小i=0;i
正如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();
}
}
模板
无效随机化位(T&T){
对于(大小i=0;i为什么不进行简单的强制转换:(reinterpret\u cast)[i]=random\u uchar()代码>?您确定运行时异常与该代码段相关吗?“我想虫子在别处……”BasileStarynkevitch是的,我想是的@BasileStarynkevitch:它会生成一个SigSeGV或类似的-不是C++异常——因为<代码>(&t)+i <代码>以<代码> > <代码> >单元操作。上面的cast思想要好得多,不过第一个左括号应该移到t
之前。这对浮点类型不起作用,因为NaN不等于它本身。使用适当类型的随机值逐个字段初始化结构