none
C#で構造体と配列のコピーについて(ビッグエンディアンと、リトルエンディアン) RRS feed

  • 質問

  • 構造体と配列のコピーをしようと思っています
    以下のように単純に変換すると言うだけなら、特に問題なくできそうなのですが
    バイト配列の中身が、ビッグエンディアンだった場合でも
    構造体と配列を一括でコピーする方法は内でしょうか

    //構造体
            [StructLayout(LayoutKind.Sequential, Pack = 1)]
            struct pack1
            {
                public short s;
                public int a;
                public byte b;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
                public byte[] c;
            }

    //ボタンクリック
    private void button1_Click(object sender, EventArgs e)

            {
                pack1 p1 = new pack1();
                byte[] b = new byte[100];//テストなので、サイズがおかしいのは気にしない
                byte[] b2;

                p1 = ToStruct1(b);//配列の中野データを、構造体にコピーする
                b2 = St1ToBytes(p1);//構造体のデータを、配列にコピーする
            }

    //バイト配列から構造体
    static pack1 ToStruct1(byte[] bytes)
            {
                GCHandle gch = GCHandle.Alloc(bytes, GCHandleType.Pinned);
                pack1 result = (pack1)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(pack1));
                gch.Free();
                return result;
            }

    //構造体→バイト配列
            static byte[] St1ToBytes(pack1 obj)
            {
                int size = Marshal.SizeOf(typeof(pack1));
                IntPtr ptr = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(obj, ptr, false);
                byte[] bytes = new byte[size];
                Marshal.Copy(ptr, bytes, 0, size);
                Marshal.FreeHGlobal(ptr);
                return bytes;
            }


    というような感じで、単純に構造体と配列のやりとりはできそうなのですが・・・・
    通信データで、ビッグエンディアンのデータを取得したときにちょっと困っています

    2013年7月1日 5:42

回答

すべての返信