เค้าโครงโครงสร้างบน 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() สำหรับ struct นี้ส่งคืน 24 ไบต์ แต่ในระบบ x86/Win32 จะส่งคืน 20 ไบต์ สิ่งนี้ขัดขวางความสามารถในการทำงานร่วมกันของฉันผ่านสายอย่างมาก มีใครรู้บ้างว่าทำไม?


person dviljoen    schedule 23.02.2011    source แหล่งที่มา


คำตอบ (2)


ฉันไม่สามารถอธิบายได้ แต่ฉันสามารถยืนยันได้อย่างแน่นอน และไม่เกี่ยวข้องกับสถาปัตยกรรม CPU อีกด้วย บน ARM หรือ x86 ที่โครงสร้างนั้นมีความยาว 24 ไบต์ใน Compact Framework แต่ 20 ในเฟรมเวิร์กแบบเต็ม ถ้าฉันสร้างสิ่งที่เทียบเท่าในโค้ดเนทีฟ มันจะเป็น 20 ที่คาดไว้

เมื่อดูใน Memory View ฉันจะเห็นว่าคอมไพเลอร์กำลังเพิ่มช่องว่างภายในเป็นศูนย์ 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