Struct sizeof / Marshal.SizeOf变体

时间:2013-09-17 12:39:19

标签: c# struct marshalling

我正在尝试将struct封送到byte[],然后再返回,但在编组回ArgumentOutOfRangeException时,我会收到struct。这是代码:

public struct Response
{
    CommandNumber Command;
    ushort EstimatedRoundTripDuration;
}

protected TStruct ByteArrayToStruct<TStruct>(byte[] data) where TStruct : struct
{
    TStruct resp = new TStruct();
    int size = Marshal.SizeOf(resp);
    IntPtr ptr = Marshal.AllocHGlobal(size);

    try
    {
        Marshal.Copy(data, 0, ptr, size);
        Marshal.PtrToStructure(ptr, resp);

        return resp;
    }
    finally
    {
        Marshal.FreeHGlobal(ptr); //cleanup just in case
    }
}

问题似乎是sizeof(Response)是3,而Marshal.SizeOf(resp)是4.我明白这些可以并且预期会有所不同,但我使用相当基本的类型{{1} }。任何人都可以了解尺寸不同的原因吗?

1 个答案:

答案 0 :(得分:2)

我假设CommandNumber是一个字节。我记得,互操作层喜欢对齐数据字段。因此,您的EstimatedRoundTripDuration将与下一个偶数地址对齐,留下一个填充字节。所以它看起来像这样:

Command: 1 byte
padding: 1 byte
EstimatedRoundTripDuration: 1 byte

您可以使用StructLayout属性更改编组行为:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct Response
{
    CommandNumber Command;
    ushort EstimatedRoundTripDuration;
}