从 std::vector<无符号字符中的数据填充结构>
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
),所以您不能做这两件事。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 在运行时处理类型擦除的数据-如何不重新发明轮子