Struct Layout на WinCE дает неожиданные результаты - PullRequest
1 голос
/ 24 февраля 2011
[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 байтов. Это серьезно затрудняет мою совместимость по проводам. Кто-нибудь знает почему?

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

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

0 голосов
/ 24 февраля 2011

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

...