2011-07-21 22 views
1

私は長時間の問題で取り組んできたので、ここでこの問題の解決方法を知りたい人はいませんか? ソケットを介してパケットを送信する従来のC++プログラムがあります。これらはC++の構造体を含んでいますので、私のC#アプリケーションのC++のような構造体を定義し、バイト配列を読み込むだけで簡単にできると思いました。 私はそれがそれほど簡単ではないことに気がつきました。私は問題を整列させて煮詰めてしまったと思います。バイト配列のデータをC#の構造体にマッピングする

私のC++のstructのようになります。

私は、このようなC#の構造体に変換できると思っていた
typedef struct 
{ 
    int     int_1; 
    short    short_1; 
    long    long_1; 
    char    char_11[11]; 
    long    long_2; 
    short    short_2; 
    int     int_2; 

} TEST_KLIENT_REC, *PTEST_KLIENT_REC; 

[StructLayout(LayoutKind.Explicit, Pack=0)]  
public struct TEST_KLIENT_REC 
     { 
      [FieldOffset(0)] 
      [MarshalAs(UnmanagedType.I4)] 
      public int   int_1;   // 4 
      [FieldOffset(4)] 
      [MarshalAs(UnmanagedType.I2)] 
      public short  short_1;  // 2 
      [FieldOffset(6)] 
      [MarshalAs(UnmanagedType.I4)] 
      public int   long_1;   // 4 
      [FieldOffset(12)] 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst=11)] 
      public string  char_11;  // 11 
      [FieldOffset(22)] 
      [MarshalAs(UnmanagedType.I4)] 
      public int   long_2;   // 4 
      [FieldOffset(26)] 
      [MarshalAs(UnmanagedType.I2)] 
      public short  short_2;  // 2 
      [FieldOffset(28)] 
      [MarshalAs(UnmanagedType.I4)] 
      public int   int_2;   // 4 
     } 

問題が(置くかC#のマップ短くするように思わ2バイトのパディング?)、構造体の残りの部分がひどく整列され、ガベージデータが生成されます。 これを何らかの形で行うことは可能ですか? クラスがより簡単になった場合、C#で構造体を使用することについてはあまり気にしません。

いくつかのテストデータを使用した結果、int_1、long_1およびshort_1が正しい値を取得し、その他すべてがガベージであると思われるため、ここで問題があると思われます。

いずれの考えも歓迎されています。

/J

編集:私が、私はそれがあるべきだと思うの代わりとして10を置いた場合のchar ararysは、さえDWORDで起動する必要がありそうですので、私はオフセット文字列の12の代わりに10を持っている理由にしたようです(私はあなたの数学に感謝しています) "オブジェクトのフィールドがオフセット10に含まれているため、アセンブリ 'SocketAndStructTest、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null'から 'TEST_KLIENT_REC'型を読み込めませんでした誤って整列されているか、または非オブジェクトフィールドによって重複しています。

+0

6 + 4!= 12、ただ言って:)チェックのために、C/C++とC#の両方で 'sizeof'を行い、それらを比較してください。 – leppie

+0

なぜ私は10の論理番号を使用することができないように編集を追加しました – Jontatas

+0

あなたのC++の長い型にマッチさせるためにあなたのC#構造体で長い型を使わないのはなぜですか? – musefan

答えて

2

FieldOffsetsは、あなたが期待していたように並んでいません。たとえば、2つのI_4とI_2の後にはFieldOffset(12)がありますが、FieldOffset(10)が必要です。

また、私はあなたがstruct[StructLayout(LayoutKind.Explicit)]を適用する必要があると思います。

+0

はい、明示的な部分について申し訳ありません、私はそれを質問テキストにコピーするのを忘れてしまった。そして、12対10について、私は自分の投稿に短い編集をしました。だからそこに行かない。 – Jontatas