【发布时间】:2012-10-11 15:59:36
【问题描述】:
我对串行通信中的消息解析有所了解,有多种形式的数据包。但都是字节数组发送的。
所以我想使用联合来解析每条消息。 但效果不佳。 以下代码是我出错的示例代码
[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 可以解决这个问题吗? 如果我将它与继承一起使用,有可能吗?
附:对不起我的英语不好
【问题讨论】: