繁体   English   中英

将对象的 std::vector 从/转换为 unsigned char 的 std::vector

[英]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;
}

http://coliru.stacked-crooked.com/a/7801aa3a17cd171f

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM