我有下面的結構定義從HID設備報告集合返回的數據:填充,從數據結構中的一個std ::矢量<無符號字符>
struct DevInfo {
char unknown[0x40];
string name;
char unknown2[0x240];
};
它目前尚不完整,但是這無關我題。以前,我是用memcpy
將數據從一個字符數組複製,像這樣填充此結構的實例:
// 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
結構中獲取二進制數據的適當方法?
'string name'的類型是什麼? (如果它是'std :: string',那麼任何類型的按位複製都不會起作用)。 – Mankarse
@Mankarse:是的,它是'std :: string',我想那就是問題了? –
你的代碼有兩個問題:DevInfo不是標準佈局,你永遠不會創建一個'DevInfo'對象(你只需要創建一個未初始化的指針到'DevInfo')。我建議改變設計,使'sendCommand'返回一個[boost :: any](http://www.boost.org/doc/libs/release/doc/html/any.html),[boost :: variant ](http://www.boost.org/doc/libs/release/doc/html/variant.html),或者一個'unique_ptr'到一個基類(你可以適當地向下轉換)。 – Mankarse