我想为我的小游戏引擎编写一个自定义的二进制文件。 我使用过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类型的值转换为字节数组,并将其附加到矢量列表中。
再次获取它们并将其转换回原始值。
偏移量和字节大小都是已知的。
这是一个示例:场景中有两个网格。
现在我得到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
列表中。
如何将它们转换为字节数组并返回?
答案 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。