2

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>myから my DevInfostructにバイナリ データを取得する適切な方法は何ですか?

4

1 に答える 1

8

単純にコピー可能な標準レイアウト型である限り、またはに格納されているバイナリ データからオブジェクトを生成するために、std::memcpyまたはを使用することを妨げるものは何もありません。std::copyvector

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)、これらのいずれも実行できません。

于 2012-08-29T15:25:16.860 に答える