我有一個C++結構,看起來像這樣一個結構:不能封送包含一個工會
struct unmanagedstruct
{
int flags;
union
{
int offset[6];
struct
{
float pos[3];
float q[4];
} posedesc;
} u;
};
而且我想整理一下它像這樣在C#:
[StructLayout(LayoutKind.Explicit)]
public class managedstruct {
[FieldOffset(0)]
public int flags;
[FieldOffset(4), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] offset;
[StructLayout(LayoutKind.Explicit)]
public struct posedesc {
[FieldOffset(0), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
public float[] pos;
[FieldOffset(12), MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
public float[] q;
}
[FieldOffset(4)]
public posedesc pose;
}
然而,當我嘗試將數據加載到我的結構中時,只有偏移量數組的前3個元素在那裏(數組的長度爲3)。我可以證實他們的價值觀是正確的 - 但我仍然需要其他3個要素。我做了什麼明顯錯誤?
我使用這些功能加載結構:
private static IntPtr addOffset(IntPtr baseAddress, int byteOffset) {
switch (IntPtr.Size) {
case 4:
return new IntPtr(baseAddress.ToInt32() + byteOffset);
case 8:
return new IntPtr(baseAddress.ToInt64() + byteOffset);
default:
throw new NotImplementedException();
}
}
public static T loadStructData<T>(byte[] data, int byteOffset) {
GCHandle pinnedData = GCHandle.Alloc(data, GCHandleType.Pinned);
T output = (T)Marshal.PtrToStructure(addOffset(pinnedData.AddrOfPinnedObject(), byteOffset), typeof(T));
pinnedData.Free();
return output;
}
加載例如:
managedstruct mystruct = loadStructData<managedstruct>(buffer, 9000);
讓我知道如果你需要更多的信息。
編組代碼應該如何知道何時將聯合編組爲「int []」或「float []」?它應該爲每個數組元素選擇,還是總是一個或另一個? – 2010-01-01 00:32:55