Struct Layout в WinCE дает неожиданные результаты

[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 байтов. Это серьезно затрудняет мою интероперабельность по сети. Кто-нибудь знает, почему?


person dviljoen    schedule 23.02.2011    source источник


Ответы (2)


Я не могу этого объяснить, но точно могу подтвердить. Это также не имеет отношения к архитектуре процессора. На ARM или x86 эта структура имеет длину 24 байта в Compact Framework и 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.

person ctacke    schedule 24.02.2011

Придумал обходной путь, решающий проблему. Я добавил дополнительный «Int32 _unused» в конец структуры, чтобы он выравнивал всю структуру по 8-байтовой границе. Размер по-прежнему 24 на Arm4 и 24 на x86. Это дает мне необходимое взаимодействие. Похоже, это проблема выравнивания архитектур Arm. Я подозреваю, что это как-то связано с членом Int64, но я не уверен.

person dviljoen    schedule 24.02.2011
comment
Дополнение структуры 4 неиспользуемыми байтами (int32) в конце делает их одинаковыми по размеру на обеих архитектурах. Это решило мою проблему. И я согласен с ctacke... похоже, это ошибка в CF. (у меня 3.5) - person dviljoen; 01.03.2011