Как преобразовать любое значение в байтовый массив и добавить его в список байтов? - PullRequest
1 голос
/ 30 июня 2019

Я хочу написать собственный двоичный файл для моего маленького игрового движка.Я работал с C #, и я знаю, как сделать это в C # с BitConvert или Convert.

Но по некоторым причинам мне нужно сделать то же самое в 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, двухбайтового массива и добавить его в мой список векторов.

И снова получить их и преобразовать их обратно в исходное значение.

все смещения и размеры байтов известны.

Вот пример: в сцене есть две сетки ..

  • Масштаб первого: point3 (10,5,15)
  • Масштаб второго: point3 (25,0,5)

Теперь яполучить xyz и преобразовать их в 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 Ответ

3 голосов
/ 30 июня 2019

Вы можете использовать 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));
}

Вам следует ознакомиться с правилом строгого алиасинга перед тем, как приступить к кастингу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...