如何将任何值转换为字节数组并将其附加到字节列表?

时间:2019-06-30 10:32:33

标签: c++ arrays binary

我想为我的小游戏引擎编写一个自定义的二进制文件。 我使用过C#,我知道如何使用BitConvert或Convert在C#中做到这一点。

但是由于某些原因,我需要在C ++中执行相同的操作。

这是我的数据结构:

Mesh Position    point3(x,y,z)       type: float   size: 4bytes *3 = 12bytes
Mesh Options     point3(b1,b2,b3)    type: bool    size: 1byte  *3 = 3bytes
Mesh Scale       point3(x,y,z)       type: int     size: 4bytes *3 = 12bytes
Mesh Tag         single              type: string  size: 8bytes *1 = 8bytes

现在我有一个未签名字符的列表:

vector<unsigned char> binary_data;

然后我可以使用push向其中添加单个字节,最后使用ofstream将其写入:

ofstream fout;
fout.open("file.bin", ios::binary | ios::out);

vector<unsigned char> binary_data;

binary_data.push_back(0x66);
binary_data.push_back(0xFF); // bool : true
binary_data.push_back(0x00); // bool : false

fout.write((char*)binary_data.data(),binary_data.size());

fout.close();

我的问题

我需要将任意类型的float,int,bool,uint,double类型的值转换为字节数组,并将其附加到矢量列表中。

再次获取它们并将其转换回原始值。

偏移量和字节大小都是已知的。

这是一个示例:场景中有两个网格。

  • 第一个刻度:point3(10,5,15)
  • 秒级:point3(25,0,5)

现在我得到x y z并将它们转换为4个字节:

10 = > 00 00 00 0A
5 = > 00 00 00 05
15 = > 00 00 00 0F
25 = > 00 00 00 19
0 = > 00 00 00 00
5 = > 00 00 00 05

然后将它们附加到binary_data列表中。

如何将它们转换为字节数组并返回?

1 个答案:

答案 0 :(得分:3)

您可以像这样使用std::memcpy

#include <vector>
#include <cstring>

template<typename T>
void serialize(std::vector<char>& v, const T& obj){
    auto size = v.size();
    v.resize(size+sizeof(T));

    std::memcpy(&v[size], &obj, sizeof(T));
}

反序列化可以类似地完成:

template<typename T>
void deserialize(const std::vector<char>& v, std::size_t offset, T& obj){      
     std::memcpy(&obj, &v[offset],sizeof(T));
}

在进行任何类型转换之前,您应该熟悉strict aliasing rule