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
。您建议的解决方案将尝试复制16
float
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;
}