Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该使用哪种*\强制转换将任意整数类型指针强制转换为字符指针?_C++_Pointers_Casting - Fatal编程技术网

C++ 我应该使用哪种*\强制转换将任意整数类型指针强制转换为字符指针?

C++ 我应该使用哪种*\强制转换将任意整数类型指针强制转换为字符指针?,c++,pointers,casting,C++,Pointers,Casting,我需要用/dev/uradom中的数据填充一个整型变量(任意大小)。考虑到这一点,我有以下代码: std::fstream fstr("/dev/urandom", std::fstream::in | std::fstream::binary); fstr.read(reinterpret_cast<char*>(&randomseed), sizeof(randomseed)); fstr.close(); std::fstream fstr(“/dev/uradom”

我需要用/dev/uradom中的数据填充一个整型变量(任意大小)。考虑到这一点,我有以下代码:

std::fstream fstr("/dev/urandom", std::fstream::in | std::fstream::binary);
fstr.read(reinterpret_cast<char*>(&randomseed), sizeof(randomseed));
fstr.close();
std::fstream fstr(“/dev/uradom”,std::fstream::in | std::fstream::binary);
fstr.read(reinterpret_cast(&randomseed),sizeof(randomseed));
fstr.close();
(randomseed是我需要用随机数据填充的变量)


这样做是否正确(即,无论库实现如何,它是否安全),还是应该使用其他*_cast?

它不安全。只有
char
类型保证没有陷阱表示


< P> >“正确”的解决方案是在C++代码> >代码>引擎中包装<代码> /DEV/URANDOM ,并使用<代码> STD::UnimixItIn分发 < /P>您选择了正确的CAST,这是一个<代码> RealTytRask> <代码>,但是不要忘记错误处理,在读取之后检查流对象的错误标志。为了简洁起见,我不想在代码片段中包含这一点。谢谢@Veeno很好,不客气。我如何在
引擎中包装
/dev/random
?我的意思是,我知道我在这里做的是“黑客”,但是
引擎实现本身在某个点上不也必须有类似的“黑客”吗?更安全的解决方案是不使用
istream::read
,而是使用
istream::get
一次从
/dev/random
中获取一个字节吗?@Veeno:现有引擎不受大多数UB规则的约束,因为它们被视为实现的一部分,并且可能依赖于实现的其他部分。这就是说,您当然可以一次读取4个字节,并将它们放入无符号长字符串中,只需将第二个字节移位8位,第三个字节移位16位,第四个字节移位24位即可。由于操作是数值操作,并且在类型的范围内,因此不会出现陷阱问题。当然,这可能会留下一些位为零,但对于随机引擎来说这不是问题。分布将考虑到这一点,使用随机引擎的最小/最大值。。。为什么我可以从
/dev/uradom
中一次读取四个字节,而不是一个(读取一个
char
不意味着只读取一个字节吗?我可以读取四个字节
sizeof(随机种子)
次,按位异或,将每四个字节转换为一个字节,相应地移位,然后用随机数据填充变量
randomseed
,但这似乎是非常浪费的-我宁愿只从
/dev/urandom
中读取我需要的数据。呃,恐怕你真的得不到它。你可以读取一个,只是不太方便随机(只有256种可能性)。此外,你似乎非常坚持
sizeof(randomseed)
,但这是一个毫无意义的数字。它不会告诉你允许的值范围。因此,你有
std::numeric_limits
,你可以用它来选择一个合适的
std::uniform_int_distribution
。嗯,我“坚持”在
sizeof上(随机种子)
因为这告诉我需要从
/dev/urandom
中读取多少字节,才能用随机数据填充整个
randomseed
。是的,一个字节只有256种可能性,我知道这一点,但如果我读取四个字节,仍然是256^4=2^32种可能性,不管我是一次读取一个还是同时读取所有四个字节。