![](/img/trans.png)
[英]Initializing a struct with the contents of a std::vector<unsigned char>
[英]Populate a struct from data in a std::vector<unsigned char>
我有以下结构定义从HID设备报告的集合返回的数据:
struct DevInfo {
char unknown[0x40];
string name;
char unknown2[0x240];
};
目前尚不完整,但这与我的问题无关。 以前,我使用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";
这行得通,除了我显然在做我不应该做的事情(从函数返回对char数组的引用)。 因此,在研究之后,我切换到了更安全的std::vector<unsigned char>
方法,但是现在我无法使用memcpy
来填充结构中的数据。
有人建议我使用std::vector<DevInfo>
代替std::vector<unsigned char>
,但是问题是可以从HID设备中检索到几种不同的报告,因此我需要能够使用相同的函数( sendCommand
)填充不同的结构。
从我的std::vector<unsigned char>
到我的DevInfo
结构中获取二进制数据的合适方法是什么?
只要它是普通可复制的标准布局类型,就不会阻止您使用std::memcpy
或std::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()
但是,在您的情况下,您似乎有一个非平凡的数据成员(假设该string
引用了std::string
),因此您将无法执行上述任何一项操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.