私は長時間の問題で取り組んできたので、ここでこの問題の解決方法を知りたい人はいませんか? ソケットを介してパケットを送信する従来の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'型を読み込めませんでした誤って整列されているか、または非オブジェクトフィールドによって重複しています。
6 + 4!= 12、ただ言って:)チェックのために、C/C++とC#の両方で 'sizeof'を行い、それらを比較してください。 – leppie
なぜ私は10の論理番号を使用することができないように編集を追加しました – Jontatas
あなたのC++の長い型にマッチさせるためにあなたのC#構造体で長い型を使わないのはなぜですか? – musefan