私は助けが必要です。私はunsigned char *
構造体を持っていると言う
struct{
int a=3;
char b='d';
double c=3.14;
char d='e';
} cmp;
unsigned char input[1000];
l= recv(sockfd,input , sizeof(cmp),0);
cmpとinputを比較したい。最速の方法は何ですか?
よろしくお願いします。
コンパイラが構造体のフィールド間にギャップがないことを保証する場合 (通常はパッキングが原因で発生します)、または #pragna を使用してそのようなギャップをキャンセルできる場合は、次のいずれかで比較できます。
memcmp(&cmp, input, sizeof(stuct ThesSruct));
または、私の好み:
cmp == *(struct TheStruct *)input // provided the struct doesn't contain pointers.
しかし、より安全な方法は、フィールドごとに比較することです。さらに、生の入力から int、float などを抽出するための特別な関数を準備します。たとえば、インデックス n で int を抽出するのは、次のように簡単です。
*(int *)&input[n]
ただし、文字を 8、16、24 ビットでシフトするなど、より複雑になる場合があります。
要するに、通信データへのアクセスは、すべての基本要素をチェックし、何も仮定せずに、最も堅牢な方法で行う必要があります。
reinterpret_cast を試してみてください。これにより、char * を cmp * に任意にキャストできます * http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx
一般的なケースでは、James Kantzes のコメントは正しいので、そのように比較することはできません。これは、とりわけ、バイト パディングによるものです。
ただし、特定のケースでは、次の前提があります。
送信者は構造体から直接送信しています。
cmp c{ ...set variables... };
send(sockfd, (char*)&c, sizeof(c));
要するに、これは構造体を転送する非常に脆弱な方法であり、単純なテストや簡単なハック以外には使用しないでください。