[英]convert a std::vector of objects from/to a std::vector of unsigned char
我有一些定义如下的类,只包含一些简单的数据类型
class A
{
public:
float xxx;
int yyy;
}
我想将该对象的向量转换为无符号字符的向量,反之亦然。 有没有一个快速的解决方案来做到这一点?
谢谢!
更新!
谢谢@Maciej Załucki,这正是我需要的,确实有很大的帮助,我将您的代码重构为以下方法。希望您不介意。
template<typename T>
static vector<T> blob_to_vectorT(vector<unsigned char>& buffer) {
vector<T> result(buffer.size() / sizeof(T));
memcpy(result.data(), buffer.data(), buffer.size());
return result;
}
template<typename T>
static vector<unsigned char> vectorT_to_blob(vector<T>& dataT) {
int datasize = sizeof(T) * dataT.size();
vector<unsigned char> result(datasize);
memcpy(result.data(), dataT.data(), datasize);
return result;
}
我也以自己的方式想通了。
template<typename T>
static vector<T> blob_to_vectorT(vector<unsigned char>& buffer) {
const T* bytesT = reinterpret_cast<const T*>(&buffer[0]);
vector<T> result(bytesT, bytesT + buffer.size() / sizeof(T));
return result;
}
template<typename T>
static vector<unsigned char> vectorT_to_blob(vector<T>& dataT) {
const unsigned char* bytes = reinterpret_cast<const unsigned char*>(&dataT[0]);
vector<unsigned char> result(bytes, bytes + sizeof(T) * dataT.size());
return result;
}
让我猜猜,这个 unsigned char 的向量实际上是某种序列化数据? 最简单的方法就是
std::vector<unsigned char> vec(sizeof(A));
memcpy(vec.data(), &a, sizeof(A));
您可以反向执行以恢复您的结构。 它不关心填充(也将被复制)。 如果您想要一个包含许多项目的向量,则只需创建所需大小的向量并按偏移量移动数据。
std::vector<A> source;
[...]
std::vector<unsigned char> vec(sizeof(A) * source.size());
for (size_t i = 0; i < source.size(); ++i)
{
memcpy(vec.data() + (sizeof(A) * i), &source[i], sizeof(A));
}
或者,如果您想变得懒惰/聪明(这是同义词吗?),请这样做:
std::vector<A> source;
[...]
size_t dataSize = sizeof(A) * source.size();
std::vector<unsigned char> vec(dataSize);
memcpy(vec.data(), source.data(), dataSize);
举个例子(没有进行完整性检查)。
#include <iostream>
#include <vector>
#include <cstring>
class A
{
public:
int i;
float f;
};
int main()
{
std::vector<A> source;
source.push_back({1, 2.345});
source.push_back({6, 7.89});
// Serialize
size_t dataSize = sizeof(A) * source.size();
std::vector<unsigned char> vec(dataSize);
std::memcpy(vec.data(), source.data(), dataSize);
for (unsigned char ch : vec)
{
std::cout << (unsigned)ch << " ";
}
// Deserialize
std::vector<A> dest(vec.size() / sizeof(A));
std::memcpy(dest.data(), vec.data(), vec.size());
std::cout << "\n" << dest[0].i << " " << dest[0].f;
std::cout << "\n" << dest[1].i << " " << dest[1].f;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.