C# 结构体

        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct Data
        {
            public int MessageID;
            public double price;
            public long number;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string str;
            //public char[] str;
            /**
            public Data(int i)
            {
                MessageID = 0;
                price = 0.0;
                number = 0;
                str = new char[i];   
            }
             * **/
        }

http://rtx2005.blog.163.com/blog/static/85282552007112101729996/

        public byte[] rawSerialize(object obj)
        {
            int rawsize = Marshal.SizeOf(obj);
            IntPtr buffer = Marshal.AllocHGlobal(rawsize);
            Marshal.StructureToPtr(obj, buffer, false);
            byte[] rawdatas = new byte[rawsize];
            Marshal.Copy(buffer, rawdatas, 0, rawsize);
            Marshal.FreeHGlobal(buffer);
            return rawdatas;
        }

        public BMTData rawDeserialize(byte[] rawdatas)
        {
            Type anytype = typeof(BMTData);
            int rawsize = Marshal.SizeOf(anytype);
            if (rawsize > rawdatas.Length)
                return new BMTData();
            IntPtr buffer = Marshal.AllocHGlobal(rawsize);
            Marshal.Copy(rawdatas, 0, buffer, rawsize);
            object retobj = Marshal.PtrToStructure(buffer, anytype);
            Marshal.FreeHGlobal(buffer);
            return (BMTData)retobj;
        }

        private void ReadStruct()
        {
            int currentLength = MemDB.GetLength();
            int currentCount = MemDB.GetCount();
            Byte[] data = new Byte[currentLength];
            MemDB.Read(ref data);
            BMTData item = rawDeserialize(data);
            String str = item.MessageID + "," + item.number + "," + item.price + "," + item.str;
            MessageBox.Show(str);
            lblUsedSize.Text = currentLength.ToString();
            lblCount.Text = currentCount.ToString();
            return;
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Marshal.SizeOf(typeof(BMTData)) + "");
             List<BMTData> datas = new List<BMTData>();
             BMTData item = new BMTData();
             item.MessageID = 1;
             item.number = 100;
             item.price = 1.2;
             item.str = "ABCD";
           
             datas.Add(item);
            /**
             String str = item.MessageID + "," + item.number + "," + item.price + ",";
             foreach(char ch in item.str)
                str += ch;
             str += "/n";
            **/
             //lstData.Items.Add(str);
             byte[] bytData = rawSerialize(item);
             MemDB.Write(bytData,bytData.Length);
            

        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值