シリアル通信でのメッセージ解析を考えていたのですが、形の違うパケットがたくさんあります。しかし、それらはすべてバイト配列で送信されます。
そこで、unionを使用して各メッセージを解析することを考えました。しかし、それはうまく機能していません。次のコードは私がエラーになっているサンプルコードです
[StructLayout(LayoutKind.Explicit, Size=12)]
public struct UnionPacket
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=12)]
public byte[] data;
[FieldOffset(0)]
public float Time;
[FieldOffset(4)]
public Int16 CoordX;
[FieldOffset(6)]
public Int16 CoordY;
[FieldOffset(8)]
public byte Red;
[FieldOffset(9)]
public byte Green;
[FieldOffset(10)]
public byte Blue;
[FieldOffset(11)]
public byte Alpha;
}
これが可能であれば、それは非常に幸せですが、そうではありません。このコードはTypeLoadExceptionを発生させます。「...オフセット0にオブジェクトフィールドが含まれているため、オブジェクトフィールドが正しく配置されていないか、非オブジェクトフィールドとオーバーラップしています。」
だから私はこのようないくつかのコードを変更しました
[StructLayout(LayoutKind.Explicit, Size= 12)]
public struct UnionPacket
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
[FieldOffset(0)]
public byte[] data;
//[FieldOffset(0)]
//public float Time;
[FieldOffset(4)]
public Int16 CoordX;
[FieldOffset(6)]
public Int16 CoordY;
[FieldOffset(8)]
public byte Red;
[FieldOffset(9)]
public byte Green;
[FieldOffset(10)]
public byte Blue;
[FieldOffset(11)]
public byte Alpha;
}
テストのために、オフセットが0の時間フィールドを無効にしましたが、これは発生しませんでした。ただし、他のフィールドを変更しても、バイト配列は変更されません。バイト配列の実際のメモリ位置は他のヒープに割り当てられていると思いますので、それはできません。
C#でこの問題を解決する方法はありますか?これを解決できるのはC++またはCだけですか?これを継承で使用する場合、それは可能ですか?
PS私の貧弱な英語について申し訳ありません