gpt4 book ai didi

c++ - 使用 memcpy 将 float 组复制到 uint8_t 数组是否有效

转载 作者:搜寻专家 更新时间:2023-10-31 00:07:14 28 4
gpt4 key购买 nike

我有一个 float 数组(每个 float 4 个字节),我想将数据复制到一个字节数组 (uint8_t) 并将其视为字节。稍后我可能想将字节数据复制回 float 数组,并再次将其视为 float 以进行各种操作。这在 C++ 中有效吗?换句话说,是不是像这样,我暂时将 float 视为有效字节?

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
}

最佳答案

是的,大部分时间都很好1。我假设 uint8_t 为字符类型设置别名(它在现代平台上这样做)。 float 是可复制的,因此明确允许像那样移动它们:

[basic.types]

2 For any object (other than a base-class subobject) of trivially copyable type T, whether or not the object holds a valid value of type T, the underlying bytes ([intro.memory]) making up the object can be copied into an array of char, unsigned char, or std​::​byte ([cstddef.syn]). If the content of that array is copied back into the object, the object shall subsequently hold its original value.

如果一切都检查完毕,标准要求您取回您的 float 。为了更加安全,可以添加此检查...

static_assert(std::is_same_v<unsigned char, std::uint8_t>);

...如果您有太多代码需要更改。否则,最好使用 std::byte 来表示您正在处理原始字节。


<子>1 - 参见 When is uint8_t ≠ unsigned char? , 由 @Ted Lyngmo 提供.

关于c++ - 使用 memcpy 将 float 组复制到 uint8_t 数组是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54529989/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com