1

我创建了一个如下结构:

[StructLayout(LayoutKind.Explicit, Pack = 1)]
    public class NodRecord
    {
        [FieldOffset(0)]
        public ushort Driver;


        [FieldOffset(2)]
        public ushort BaudRate;

        [FieldOffset(4)]
        public ushort EnquiryInterval;

        [FieldOffset(6)]
        public byte Protocol;

        [FieldOffset(7)]
        public ushort Delay;

        [FieldOffset(9)]
        public NodIPAddress IP_Addr_Other;

        [FieldOffset(13)]
        public ushort IP_Port_Other;

        [FieldOffset(15)]
        public ushort IP_Port_Own;

        [FieldOffset(17)]
        public ushort Application;
    }

然后我用下面的代码阅读了它:

 readBuffer = reader.ReadBytes(sizeType);
 handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
 nodes = (NodRecord)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NodRecord));
 handle.Free();

我想知道在 x86、x64 和 cortex arm 处理器中一切正常,但在 Atmel ARM9 AT91SAM9G20 上的ushort变量我得到了错误的值,例如第一个和第三个下一个字节值替换而不是第一个和第二个下一个字节,但是对于字节值一切都很好

4

1 回答 1

2

一些旧的 ARM 处理器(以及一些新的,取决于它们的配置和操作系统)在涉及任何未对齐的地址时有一个错误的概念:它们不会出错,也不会在指定的地址加载值。他们所做的是(我忘记了细节)某种无意识的旋转或地址对齐,以便数据的输出与您(或其他任何人)所期望的不同。Mono 不能很好地处理这种情况(这意味着要为所有表现良好的情况减慢代码速度,因此我们做出了权衡,让几乎每个人都能享受速度,而少数人处理边缘情况)。您有两种可能的解决方案:

于 2012-12-31T09:05:56.733 回答