返回> 网站首页 

WindowMobile字节对齐接收方法

yoours2014-02-28 15:45:01 阅读 1508

简介一边听听音乐,一边写写文章。

一、字节对齐
Windows Mobile结构体默认为1字节对齐。

二、结构体字节对齐使用方法
1. 普通结构体
    [StructLayout(LayoutKind.Explicit, Size = 8)]
    public struct struParam{
        [FieldOffset(0)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public byte[] Param1;
        [FieldOffset(6)]
        public UInt16 Param2;
    };

2. 结构体嵌套函数
    [StructLayout(LayoutKind.Explicit, Size = 29)]
    public struct struParam
    {
        [FieldOffset(0)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 29)]
        private byte[] byData;

        public byte[] Param1()
        {
            return byData;
        }

        public byte Param2()
        {
            return byData[6];
        }

        public byte Param3()
        {
            return byData[7];
        }

        public byte Length()
        {
            return byData[8];
        }

        public byte[] Data()
        {
            byte[] buff = new byte[Length()];
            Array.Copy(byData, 9, buff, 0, Length());
            return buff;
        }
   };

3. 结构体嵌套结构体
    public struct struRecv
    {
        public byte InfoType;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 29)]
        private byte[] byData;

        public void Init() {
            byData = new byte[29];
        }

        public struParam1 FunstruParam1()
        {
            return (struParam1)FUNCE.BytesToStuct(byData, typeof(struParam1));
        }

        public struParam2 FunstruParam2()
        {
            return (struParam2)FUNCE.BytesToStuct(byData, typeof(struParam2));
        }

        public struParam3 FunstruParam3()
        {
            return (struParam3)FUNCE.BytesToStuct(byData, typeof(struParam3));
        }
    };

        public static object BytesToStuct(byte[] bytes, Type type)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(type);
            //byte数组长度小于结构体的大小
            if (size > bytes.Length)
            {
                //返回空
                return null;
            }

            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将byte数组拷到分配好的内存空间
            Marshal.Copy(bytes, 0, structPtr, size);
            //将内存空间转换为目标结构体
            object obj = Marshal.PtrToStructure(structPtr, type);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);

            //返回结构体
            return obj;
        }


微信小程序扫码登陆

文章评论

1508人参与,0条评论