他的问题是关于在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
}
答案 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]);
}
}