从std :: vector <unsigned char>中的数据填充结构

And*_*y E 1 c++

我有以下结构定义从HID设备报告集合返回的数据:

struct DevInfo {
    char unknown[0x40];
    string name;
    char unknown2[0x240];
};
Run Code Online (Sandbox Code Playgroud)

它目前尚未完成,但这与我的问题无关.以前,我使用memcpy从char数组中复制数据来填充此结构的实例,如下所示:

// get data from HID device
unsigned char *response = sendCommand(DEV_REPORT);

// Copy to struct
DevInfo *info;
memcpy(&info, &response[0], sizeof(response));

// Output name
cout << "Name: " << info->name << "\n";
Run Code Online (Sandbox Code Playgroud)

这有效,除了我显然做了一些我不应该做的事情(从函数返回对char数组的引用).因此,经过研究,我转而采用更安全的std::vector<unsigned char>方法,但现在我不能memcpy用来填充结构中的数据.

有人建议我使用std::vector<DevInfo>而不是std::vector<unsigned char>,但问题是有几个不同的报告可以从HID设备检索,所以我需要能够使用相同的函数(sendCommand)填充不同的结构.

什么是从std::vector<unsigned char>我的DevInfo结构中获取二进制数据的合适方法?

Mik*_*our 6

没有什么来自使用阻止你std::memcpystd::copy填充从存储在一个二进制数据的对象vector,只要它是平凡的,可复制的标准布局类型:

DevInfo info;
std::vector<char> response = get_response();

assert(response.size() == sizeof info);
std::copy(response.begin(), response.end(), reinterpret_cast<char*>(&info));
std::memcpy(&info, &response[0], sizeof info); // C++11 allows response.data()
Run Code Online (Sandbox Code Playgroud)

但是,在您的情况下,您似乎有一个非平凡的数据成员(假设string引用std::string),因此您无法执行上述任何一项操作.