Struct Layout di WinCE memberikan hasil yang tidak terduga

[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;
}

Saya memiliki masalah aneh di Arm4/WinCE di mana Marshal.SizeOf() untuk struct ini mengembalikan 24 byte, tetapi pada sistem x86/Win32 ia mengembalikan 20 byte. Ini sangat menghambat interoperabilitas saya melalui kabel. Ada yang tahu kenapa?


person dviljoen    schedule 23.02.2011    source sumber


Jawaban (2)


Saya tidak bisa menjelaskannya, tapi saya pasti bisa memastikannya. Ini juga tidak ada hubungannya dengan arsitektur CPU. Baik pada ARM atau x86, struct tersebut memiliki panjang 24 byte dalam Compact Framework tetapi 20 byte dalam kerangka penuh. Jika saya membuat yang setara dalam kode asli, diharapkan 20.

Melihatnya di Memory View, saya dapat melihat bahwa kompiler menambahkan 4 byte zero padding di akhir struktur, tapi saya tidak tahu mengapa.

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

Saya pasti akan menyebut ini sebagai bug di CF.

person ctacke    schedule 24.02.2011

Menemukan solusi yang memecahkan masalah. Saya menambahkan tambahan "Int32 _unused" ke akhir struct sehingga menyelaraskan seluruh struct ke batas 8-byte. Ukurannya masih 24 di Arm4, dan 24 di x86. Ini memberi saya interop yang saya butuhkan. Tampaknya ini merupakan masalah penyelarasan pada arsitektur Arm. Saya curiga itu ada hubungannya dengan anggota Int64, tapi saya tidak yakin.

person dviljoen    schedule 24.02.2011
comment
Mengisi struct dengan 4 byte yang tidak digunakan (int32) di bagian akhir menjadikannya berukuran sama di kedua arsitektur. Itu memecahkan masalah saya. Dan saya setuju dengan ctacke... sepertinya ada bug di CF. (Saya menggunakan 3.5) - person dviljoen; 01.03.2011