2

我正在尝试将 a 编组struct到 abyte[]然后再返回,但是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。我知道这些可能并且预计会有所不同,但我为此使用了相当基本的类型struct。谁能解释为什么尺寸不同?

4

1 回答 1

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;
}
于 2013-09-17T12:57:47.417 回答