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