2012-08-29 5 views
1

I HID 장치 보고서의 컬렉션에서 반환 된 데이터를 정의하는 다음과 같은 구조체가 있습니다성병 : 벡터 데이터에서 구조체 채우기 <서명 숯불>

struct DevInfo { 
    char unknown[0x40]; 
    string name; 
    char unknown2[0x240]; 
}; 

그것은 그 무관 현재 불완전하지만,이다의 내 문제. 이전에, 나는과 같이, char 배열에서 데이터를 복사 할 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<unsigned char> 대신 std::vector<DevInfo>를 사용하는 충고하지만 그게 문제가 HID 장치에서 검색 할 수있는 여러 가지 보고서가있다, 그래서 나는 같은 기능을 사용하여 다른 구조체를 채울 수 있어야합니다 (sendCommand).

std::vector<unsigned char>에서 내 DevInfo 구조체로 이진 데이터를 가져 오는 적절한 방법은 무엇입니까? 그러나

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

:

+3

'문자열 이름 '의 유형은 무엇입니까? (만약'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

아무것도 그것이 하찮게 - 복사 가능한 표준 레이아웃 타입만큼하는 vector에 저장된 이진 데이터에서 개체를 채우는 중 std::memcpy 또는 std::copy를 사용에서 당신을 중지하지있다 귀하의 사례가 아닌 것으로 나타났습니다 당신은 중요한 데이터 회원 (stringstd::string을 말합니다), 그래서 당신은 이러한 일을 할 수 없어.

+0

많은 경우 optimizer가'copy' /'memcpy'를 이것을 줄여서 어쨌든하는 것이 바람직하다는 것을 알고 있습니다 만 ... - reinterpret_cast에 허용되지 않습니까? (vec.data())', 적어도'SomeType'이'char' 정렬을 가지고 있거나 정렬 된 할당자를 사용한다면? –

관련 문제