C# C语言中数组缓冲区的并集#

C# C语言中数组缓冲区的并集#,c#,arrays,struct,union,C#,Arrays,Struct,Union,我一直在开发一个接口,它定义了一个数据缓冲区,可以在c union中转换成相关的数据结构,如下所示 union DATA_STRUCTURE { uint8_t buffer[BUFFER_SIZE]; A_STRUCT a; B_STRUCT b; }; [StructLayout(LayoutKind.Explicit, Size = 16)] struct MyUnion { [MarshalAs(UnmanagedType.ByValArr

我一直在开发一个接口,它定义了一个数据缓冲区,可以在c union中转换成相关的数据结构,如下所示

union DATA_STRUCTURE {
    uint8_t buffer[BUFFER_SIZE];
    A_STRUCT a;
    B_STRUCT b;
}; 
  [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;
我可以将接收到的数据放入缓冲区,并根据缓冲区中某处定义的数据类型使用a或b读取数据

现在,我要用c#重写接口程序,我在c#中找不到类似于并集的语法,我发现在这个主题上有很多类似的帖子,建议使用FieldOffset实现,如下所示

  [StructLayout(LayoutKind.Explicit)]
  struct MyUnion
  {
    [FieldOffset(0)] int I;
    [FieldOffset(0)] float F;
  }
我只是尝试如下定义结构

union DATA_STRUCTURE {
    uint8_t buffer[BUFFER_SIZE];
    A_STRUCT a;
    B_STRUCT b;
}; 
  [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中。buffer[0]=x; 它将显示错误“使用可能未分配的字段‘缓冲区’”。 此外,即使我可以将值放入缓冲区,如果我尝试通过a或b访问数据,似乎也会返回相同的错误

我也尝试过使用带有不安全选项的指针方法,但似乎我仍然无法获取不安全结构的地址,下面的语句是不允许的

  byte *ptr = (byte *) &data;
  byte *ptr = data.buffer;
  byte *ptr = &data.buffer[0];
也许我还是因为使用了不安全的关键字而漏掉了什么

我可以知道,对于上述情况,是否有任何方法可以在C#中实现union结构


非常感谢。

由于数组是一个托管对象(而不是结构),我认为您不能真正使用它玩联合样式的把戏

我只需要使用一个普通的
字节[]
直到我准备好转换,然后从数组(可能是通过)获取
IntPtr
,然后使用来获取
a_结构
B_结构
。当然,如果您的访问模式更像:

  • 将其视为数组
  • 将其视为
    A_结构
  • 将其视为数组
  • 将其视为
    B_结构

谢谢你的建议。通过将IntPtr与Marshal.PtrToStructure一起使用,可以帮助使用该结构从缓冲区检索数据。但是,PtrToStructure将创建数据的副本,而不是指向原始内存位置。由于原始缓冲区将用于返回,因此需要将数据转换回缓冲区。它需要通过Marshal.StructureToPtr将内容复制到IntPtr,然后使用Marshal.copy将内容填充回缓冲区。通过使用一些封送处理操作,我可以得到与以前类似的结果。谢谢。