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変数の値が間違っています。たとえば、次の1番目と2番目のバイトの代わりに、次の1番目と3番目のバイトの値が置き換えられますが、バイト値の場合はすべて問題ありません。

4

1 に答える 1

2

一部の古い ARM プロセッサ (構成とオペレーティング システムによっては新しいプロセッサも) は、アライメントされていないアドレスに関しては概念が壊れています。彼らがしているのは (詳細は忘れましたが) なんらかの意味のないローテーションまたはアドレス調整であり、データがあなた (または他の誰か) が期待するものとは異なります。Mono はこのケースを適切に処理しません (これは、行儀の良いすべてのケースのコードを遅くすることを意味するため、ほとんどすべての人が速度を享受できるようにし、少数の人々がフリンジ ケースに対処できるようにするというトレードオフを行いました)。考えられる解決策は 2 つあります。

于 2012-12-31T09:05:56.733 に答える