0

私は助けが必要です。私は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を比較したい。最速の方法は何ですか?

よろしくお願いします。

4

3 に答える 3

2

コンパイラが構造体のフィールド間にギャップがないことを保証する場合 (通常はパッキングが原因で発生します)、または #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 ビットでシフトするなど、より複雑になる場合があります。

要するに、通信データへのアクセスは、すべての基本要素をチェックし、何も仮定せずに、最も堅牢な方法で行う必要があります。

于 2014-04-28T17:28:01.803 に答える
0

reinterpret_cast を試してみてください。これにより、char * を cmp * に任意にキャストできます * http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx

于 2014-04-28T17:20:59.687 に答える
0

一般的なケースでは、James Kantzes のコメントは正しいので、そのように比較することはできません。これは、とりわけ、バイト パディングによるものです。

ただし、特定のケースでは、次の前提があります。

  • 送信側は受信側と同じ CPU アーキテクチャ上にある
  • 送信側が受信側と同じコンパイラとリンカーを使用している
  • アプリケーションは、同じコンパイラ/リンカー フラグでコンパイルされます。
  • ...その他...要点はわかります。
  • 送信者は構造体から直接送信しています。

    cmp c{ ...set variables... }; send(sockfd, (char*)&c, sizeof(c));

要するに、これは構造体を転送する非常に脆弱な方法であり、単純なテストや簡単なハック以外には使用しないでください。

于 2014-04-28T17:34:49.710 に答える