我正在尝试将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} }。任何人都可以了解尺寸不同的原因吗?
答案 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;
}