C# 结构和字节数组之间的转换

C# 结构和字节数组之间的转换,c#,windows-mobile,interop,C#,Windows Mobile,Interop,他的问题是关于结构和字节数组之间的转换。许多解决方案都基于GCHandle.Alloc()和Marshal.StructureToPtr()。问题是这些调用会产生垃圾。例如,在WindowsCE6R3下,大约400字节的garbarge是用一个小结构制作的。如果可以使用下面的代码,则可以认为该解决方案更清洁。似乎sizeof()在编译过程中发生得太晚,无法工作 public struct Data { public double a; public int b; publ

他的问题是关于结构和字节数组之间的转换。许多解决方案都基于
GCHandle.Alloc()
Marshal.StructureToPtr()
。问题是这些调用会产生垃圾。例如,在WindowsCE6R3下,大约400字节的garbarge是用一个小结构制作的。如果可以使用下面的代码,则可以认为该解决方案更清洁。似乎
sizeof()
在编译过程中发生得太晚,无法工作

public struct Data
{
    public double a;
    public int b;
    public double c;
}

[StructLayout(LayoutKind.Explicit)]
public unsafe struct DataWrapper
{
    private static readonly int val = sizeof(Data);

    [FieldOffset(0)]
    public fixed byte Arr[val]; // "fixed" is to embed array instead of ref

    [FieldOffset(0)]
    public Data; // based on a C++ union
}

实际上,您可以使用常量值1作为DataWrapper中固定数组的大小。访问不安全的固定数组时没有边界检查,也没有任何机制在运行时请求其长度。偏移量0处的数据成员的存在足以确保您可以在DataWrapper.Arr中读取和写入sizeof(Data)字节

话虽如此,一个更直接的解决方案是将数据*指针转换为字节*,如下所示:

unsafe {
    Data d = new Data();
    d.a = 125.5;
    d.b = 0x7FEEDDEE;
    d.c = 130.0;
    byte* bytes = (byte*)&d;
    for (int i = 0; i < sizeof(Data); i++) {
      Console.WriteLine(i + ": " + bytes[i]);
    }
}
不安全{
数据d=新数据();
d、 a=125.5;
d、 b=0x7FEEDDEE;
d、 c=130.0;
字节*字节=(字节*)&d;
对于(int i=0;i
我不确定您在这里想做什么。不清楚你为什么需要工会。您需要从本机代码和数据中访问Arr[]吗?我的目标是将结构扁平化为字节数组,以写入共享内存。然后,能够检索字节数组并将其转换回结构。联合或显示的不安全代码可以实现这一点。一个问题是上面的解决方案不适用于泛型。一位同事给我指了指下面的网站,这个解决方案自动发出IL代码来进行T型转换。不知何故,这感觉有风险,但可能是我不了解。