【发布时间】:2019-03-14 21:30:15
【问题描述】:
我一直在研究一些定义了数据缓冲区的接口,它可以转换为c union中的相关数据结构,如下所示,
union DATA_STRUCTURE {
uint8_t buffer[BUFFER_SIZE];
A_STRUCT a;
B_STRUCT b;
};
我可以将接收到的数据放入buffer中,根据buffer中某处定义的数据类型使用a或b读取数据。
现在我要重写c#中的接口程序,在c#中找不到union like语法,发现有很多类似的帖子,建议使用FieldOffset作为下面,
[StructLayout(LayoutKind.Explicit)]
struct MyUnion
{
[FieldOffset(0)] int I;
[FieldOffset(0)] float F;
}
我只是尝试定义如下结构,
[StructLayout(LayoutKind.Explicit, Size = 16)]
struct MyUnion
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
[FieldOffset(0)] public byte[] buffer;
[FieldOffset(0)] public A_STRUCT a;
[FieldOffset(0)] public B_STRUCT b;
}
MyUnion data;
但我无法通过 data.buffer[0] = x; 之类的语句将数据填充到缓冲区中。 它将显示错误“使用可能未分配的字段'缓冲区'”。 此外,即使我可以将值放入缓冲区,如果我尝试通过 a 或 b 访问数据,似乎也会返回相同的错误。
我也尝试过使用带有不安全选项的指针方法,但似乎我仍然无法获取不安全结构的地址,不允许以下语句,
byte *ptr = (byte *) &data;
byte *ptr = data.buffer;
byte *ptr = &data.buffer[0];
也许我仍然错过了使用不安全关键字的一些东西。
请问有没有办法在 C# 中针对上述情况实现联合结构?
非常感谢。
【问题讨论】: