2012-08-29 44 views
1

我有下面的結構定義從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結構中獲取二進制數據的適當方法?

+3

'string name'的類型是什麼? (如果它是'std :: string',那麼任何類型的按位複製都不會起作用)。 – Mankarse

+0

@Mankarse:是的,它是'std :: string',我想那就是問題了? –

+1

你的代碼有兩個問題: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

回答

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() 

然而,你的情況看起來你有一個非平凡的數據成員(假設string指的是std::string),所以你不能做這些事情。

+0

我知道,在許多情況下,優化器會減少'copy' /'memcpy'到這個方向,並且按照你的方式可能會更好,但是... - 是不是也允許'reinterpret_cast ( vec.data())',至少如果'SomeType'具有'char'對齊或者使用對齊的分配器? –

相關問題