我有一个浮点数组(每个浮点4个字节),我想将数据复制到字节数组(uint8_t)并将其视为字节。稍后,我可能想将字节数据复制回float数组,并再次将其视为用于各种操作的float。这在c ++中有效吗?换句话说,是这样的事情,我将浮点数暂时视为有效字节?
std::array<std::uint8_t, 40> b;
b.fill(0);
std::array<float,10> f;
f.fill(3.14);
std::memcpy(b.data(),f.data(),40);
std::array<float,10> f2;
f2.fill(0);
std::memcpy(f2.data(),b.data(),40);
for(std::size_t i=0;i<10;i++)
{
std::cout<<f2[i]<<std::endl; //now i want to access the float data
}
答案 0 :(得分:6)
是的,基本上没问题 1 。我假设uint8_t
为字符类型的别名(在现代平台上也是如此)。浮点数很容易复制,因此明确允许移动它们:
[基本类型]
2对于平凡的任何对象(基类子对象除外) 可复制的类型T,对象是否持有类型的有效值 T,组成对象的基础字节([intro.memory])可以是 复制到char,unsigned char或std :: byte数组中 ([cstddef.syn])。如果该数组的内容被复制回 对象,该对象随后应保留其原始值。
如果一切检查完毕,标准要求您重新获得花车。为了更加安全,可以添加此检查...
static_assert(std::is_same_v<unsigned char, std::uint8_t>);
...如果您要更改的代码太多。否则,最好使用std::byte
来表示您正在处理原始字节。
1 -由When is uint8_t ≠ unsigned char?提供,请参见@Ted Lyngmo。