C# 获得;非对象不正确对齐或重叠”;显式结构错误
我正在尝试读取/编辑暗黑破坏神的保存文件。规范,如果有人感兴趣,但我认为它与问题无关 我有一个字节数组,其中包含我试图解析为某些结构的文件字节。我已经可以很好地读取文件头了,btu我在任务数据方面遇到了问题。我到了那里:C# 获得;非对象不正确对齐或重叠”;显式结构错误,c#,.net,marshalling,C#,.net,Marshalling,我正在尝试读取/编辑暗黑破坏神的保存文件。规范,如果有人感兴趣,但我认为它与问题无关 我有一个字节数组,其中包含我试图解析为某些结构的文件字节。我已经可以很好地读取文件头了,btu我在任务数据方面遇到了问题。我到了那里: [StructLayout(LayoutKind.Explicit, Size = 10, Pack = 1)] public struct QuestCompletationDataHeader { [MarshalAs(UnmanagedType.ByValTStr
[StructLayout(LayoutKind.Explicit, Size = 10, Pack = 1)]
public struct QuestCompletationDataHeader {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
[FieldOffset(0)]
public string Identifier;
[FieldOffset(4)]
uint _0x0004;
[FieldOffset(8)]
short _0x008;
}
[StructLayout(LayoutKind.Explicit, Size = 96, Pack = 1)]
public struct QuestData {
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 96, ArraySubType = UnmanagedType.U1)]
[FieldOffset(0)]
byte[] _0x0000; //Irrelevant for now.
}
[StructLayout(LayoutKind.Explicit, Size = 298, Pack = 1)]
public struct QuestCompletationData {
[MarshalAs(UnmanagedType.LPStruct)]
[FieldOffset(0)]
QuestCompletationDataHeader Header;
[MarshalAs(UnmanagedType.LPStruct)]
[FieldOffset(10)]
QuestData NormalQuests;
[MarshalAs(UnmanagedType.LPStruct)]
[FieldOffset(106)]
QuestData NightmareQuests;
[MarshalAs(UnmanagedType.LPStruct)]
[FieldOffset(202)]
QuestData HellQuests;
}
D2SFile类:
[StructLayout(LayoutKind.Explicit, Size = 638, Pack = 1)]
public struct D2SFile {
[MarshalAs(UnmanagedType.LPStruct)]
[FieldOffset(0)]
public D2SHeader Header;
[MarshalAs(UnmanagedType.LPStruct)]
[FieldOffset(335)]
public QuestCompletationData Quests;
}
以及我用来进行字节到结构转换的函数:
public static D2SFile ByteArrayToD2SFile(byte[] bytes) {
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
D2SFile stuff = (D2SFile)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(D2SFile));
handle.Free();
return stuff;
}
正如我所说,我已经可以单独读取文件头了,没有问题,但是当我将任务数据添加到D2SFile结构时,我得到:
无法从程序集“…”加载类型“MedianXLEditor.questcompletiondata”,因为它在偏移量10处包含一个对象字段,该字段与非对象字段不正确对齐或重叠。
由于没有人应答,而且我已经发现了错误,我想我应该这样做我自己回答,这样在谷歌搜索后碰巧来到这里的人都会过得更轻松
事实证明,数组的起始偏移量不能是4的倍数
在上面的示例中,questcompletiondata头
的长度为10字节,因此在questcompletiondata
结构上,下一个字段将从位置10开始。下一个字段恰好是QuestData
struct,它基本上是一个大数组(目前)。因此,它将尝试将该数组放置在偏移量10处,10不是4的倍数,因此它给出了异常
我更改了QuestData
struct,因此它在第一个位置不使用数组,现在可以正常工作了
此外,在编组类似于上述结构的结构时,请使用
[marshallas(UnmanagedType.Struct)]
。我当时使用的是[Marshallas(UnmanagedType.LPStruct)]
,这在后来给了我另一个例外。感谢您发布了您的解决方案的答案:您到底是怎么知道的?