我有關於串行通信中的消息解析的想法,有許多種不同形式的數據包。但它們都是通過字節數組發送的。我想使用聯合作爲C#與字節數組
所以我想用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可以解決這個問題? 如果我用繼承,這是可能的嗎?
P.S.對不起我的英語不好
三江源,我使用的第二方法,因爲使用固定陣列是難以替代DATAS,三江源。 –