我有一个浮点数组(每个浮点数4个字节),我想将数据复制到一个字节数组(uint8_t)并将其视为字节.后来我可能想要将字节数据复制回浮点数组,并将其再次作为各种操作的浮点数处理.这在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
}
Run Code Online (Sandbox Code Playgroud)
是的,它基本上很好1.我假设uint8_t别名是一个字符类型(它在现代平台上做).浮点数很容易复制,所以明确允许它们移动它们:
[basic.types]
2对于普通可复制类型T的任何对象(基类子对象除外),无论对象是否包含类型T的有效值,组成对象的基础字节([intro.memory])都可以复制到char,unsigned char或std :: byte([cstddef.syn])的数组.如果将该数组的内容复制回对象,则该对象应随后保持其原始值.
标准规定如果一切都结束,你就会收回你的花车.为了安全起见,可以添加此检查...
static_assert(std::is_same_v<unsigned char, std::uint8_t>);
Run Code Online (Sandbox Code Playgroud)
...如果你有太多的代码要改变.否则,std::byte最好使用表示您正在处理原始字节.
1 - 请参见何时uint8_t≠unsigned char?,@Ted Lyngmo礼貌.