从 std::vector<无符号字符中的数据填充结构>

Populate a struct from data in a std::vector<unsigned char>

本文关键字:数据 gt 填充 结构 无符号 std vector lt 字符      更新时间:2023-10-16

我有以下结构定义从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::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()

然而,在您的情况下,您似乎有一个非平凡的数据成员(假设string指的是std::string),所以您不能做这两件事。