C# 获得;非对象不正确对齐或重叠”;显式结构错误

C# 获得;非对象不正确对齐或重叠”;显式结构错误,c#,.net,marshalling,C#,.net,Marshalling,我正在尝试读取/编辑暗黑破坏神的保存文件。规范,如果有人感兴趣,但我认为它与问题无关 我有一个字节数组,其中包含我试图解析为某些结构的文件字节。我已经可以很好地读取文件头了,btu我在任务数据方面遇到了问题。我到了那里: [StructLayout(LayoutKind.Explicit, Size = 10, Pack = 1)] public struct QuestCompletationDataHeader { [MarshalAs(UnmanagedType.ByValTStr

我正在尝试读取/编辑暗黑破坏神的保存文件。规范,如果有人感兴趣,但我认为它与问题无关

我有一个字节数组,其中包含我试图解析为某些结构的文件字节。我已经可以很好地读取文件头了,btu我在任务数据方面遇到了问题。我到了那里:

[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)]
,这在后来给了我另一个例外。

感谢您发布了您的解决方案的答案:您到底是怎么知道的?