[StructLayout( LayoutKind.Explicit, Pack = 1, Size = 20 )]
public struct StatusStruct
{
/// <summary>
/// validation field
/// </summary>
[FieldOffset( 0 )]
public Int32 _magic;
/// <summary>
/// Packet sequence number
/// </summary>
[FieldOffset( 4 )]
public Int32 _seq;
/// <summary>
/// Packet timestamp
/// </summary>
[FieldOffset( 8 )]
public Int64 _timestamp;
/// <summary>
/// Length of data section
/// </summary>
[FieldOffset( 16 )]
public Int32 _len;
}
我在Arm4 / WinCE上有一个奇怪的问题,这个结构的Marshal.SizeOf()返回24个字节,但在x86 / Win32系统上它返回20个字节。这严重妨碍了我对线路的互操作性。有谁知道为什么?
答案 0 :(得分:1)
我无法解释,但我当然可以证实。它也与CPU架构无关。在ARM或x86上,结构在Compact Framework中最终为24个字节,在完整框架中为20个字节。如果我在本机代码中创建等效项,那就是预期的20。
在内存视图中查看它,我可以看到编译器在结构的末尾添加了4个字节的零填充,但我不知道为什么。
var test = new StatusStruct()
{
_magic = unchecked((int)0xaaaaaaaa),
_seq = unchecked((int)0xbbbbbbbb),
_timestamp = unchecked((long)0xcccccccccccccccc),
_len = unchecked((int)0xdddddddd)
};
http://blog.opennetcf.com/ctacke/binary/struct_size.png
我肯定称这是CF中的一个错误。
答案 1 :(得分:0)
提出解决问题的解决方法。我在结构的末尾添加了一个额外的“Int32 _unused”,以便它将整个结构对齐到一个8字节的边界。 Arm4上的大小仍为24,x86上为24。这给了我需要的互操作。这似乎是Arm架构上的对齐问题。我怀疑它与Int64成员有关,但我不是肯定的。