在struct和byte数组之间转换

时间:2010-05-06 00:20:08

标签: c# windows-mobile interop

他的问题是关于在struct和byte数组之间进行转换。许多解决方案都基于GCHandle.Alloc()Marshal.StructureToPtr()。问题是这些调用生成垃圾。例如,在Windows CE 6 R3下,使用小结构制作大约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 个答案:

答案 0 :(得分:1)

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

话虽如此,更直接的解决方案是将Data *指针转换为byte *,如下所示:

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]);
    }
}