C++ 将数据从POD向量复制到字节向量(干净)
假设我有一个浮点向量,由于缺少更好的术语,我想将其“序列化”为一个字节向量,即C++ 将数据从POD向量复制到字节向量(干净),c++,vector,C++,Vector,假设我有一个浮点向量,由于缺少更好的术语,我想将其“序列化”为一个字节向量,即 std::vector<float> myFloats = {1.0, 2.0, 3.0, 4.0}; std::vector<unsigned char> myBytes; std::vector myFloats={1.0,2.0,3.0,4.0}; std::向量myBytes; 现在,我将memcpyfloat设置为uint32\u t变量,并执行位移位和屏蔽操作,每次将一个字节插
std::vector<float> myFloats = {1.0, 2.0, 3.0, 4.0};
std::vector<unsigned char> myBytes;
std::vector myFloats={1.0,2.0,3.0,4.0};
std::向量myBytes;
现在,我将memcpy
float设置为uint32\u t
变量,并执行位移位和屏蔽操作,每次将一个字节插入myBytes
由于这两个文件中的内存是连续的,我有没有办法更干净地执行此操作?您可以使用
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())};
您可以这样做:
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;
}
std::vector
getByteVector(const std::vector和floats)
{
向量字节(floats.size()*sizeof(float));
std::memcpy(&bytes[0],&floats[0],bytes.size());
返回字节;
}
我认为这行不通,因为myFloats.size()只有4个,但每个float占用多个字节,在您的示例中,您将只复制第一个float(在32位系统中)。我认为这应该是myFloats.data()+(myFloats.size()*sizeof(float))作为结束迭代器。@AngelCastillo指针数学不是这样工作的
myFloats.data()
返回一个float*
到第一个float
,并将该值增加4将导致一个指针指向向量中最后一个float
。您建议的解决方案将尝试复制16float
s(假设sizeof(float)==4
@Preatorian,这对于指向float*的指针是真的,但您正在将指针强制转换为“unsigned char*”,该构造函数将按“unsigned char”大小而不是“float”来递增指针大小,最终结果将是指针将一次移动1字节四次。运行代码,您将看到。至于我建议的解决方案,memcpy将void*作为参数,这就是为什么我使用sizeof(float)作为多个参数的原因@AngelCastillo括号的放置会产生很大的不同,我正在递增浮点*
,然后进行强制转换,而不是相反。如果您仍然不确信,请自己尝试一下。@Preatorian Hah,您是对的,我的错误我没有正确阅读代码。这很好,但请注意向量构造函数将ue初始化(零初始化)在用memcpy
覆盖它们之前,所有的无符号字符
都会增加成本。下面的两个答案都很好,但都假设数据将在具有相同endian的系统上反序列化。现在的大多数系统似乎都喜欢小endian数据,但如果要将其发送到未知系统,则必须要小心。有些嵌入式系统(尤其是网络机器)仍然使用big-endian
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;
}