假设我有一个浮点数向量,我希望"序列化",因缺少一个更好的术语,转换为字节向量,即
std::vector<float> myFloats = {1.0, 2.0, 3.0, 4.0};
std::vector<unsigned char> myBytes;
现在,我memcpy
浮动到uint32_t
变量,并且做位移位和屏蔽以一次插入一个字节到myBytes
。
由于这两者中的记忆是连续的,有没有办法让我更干净地做到这一点?
答案 0 :(得分:3)
您可以在不违反严格别名的情况下使用unsigned char *
别名为其他类型,因此以下内容可以使用
std::vector<float> myFloats = {1.0, 2.0, 3.0, 4.0};
std::vector<unsigned char> myBytes{reinterpret_cast<unsigned char *>(myFloats.data()),
reinterpret_cast<unsigned char *>(myFloats.data() + myFloats.size())};
您正在使用带有两个迭代器的vector
constructor
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
答案 1 :(得分:1)
您可以这样做:
std::vector<unsigned char>
getByteVector(const std::vector<float>& floats)
{
std::vector<unsigned char> bytes(floats.size() * sizeof(float));
std::memcpy(&bytes[0], &floats[0], bytes.size());
return bytes;
}