C#文件流写入结构体


1、定义结构体


namespace WindowsFormsApplication1
{
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct fsnHead
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] HeadStart;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public UInt16[] HeadString;
            public UInt32 Counter;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public UInt16[] HeadEnd;
        }

}


2、在方法里处理

 private void button1_Click(object sender, EventArgs e)
        {
            string strFile = Application.StartupPath + "\\Data.dat";


            FileStream fs = new FileStream(strFile, FileMode.Open, FileAccess.ReadWrite);
            StreamReader sr = new StreamReader(fs);

            fsnHead fsnHeader = new fsnHead();
            int headSize = Marshal.SizeOf(typeof(fsnHead));
            byte[] tempReader = new byte[headSize];
            fs.Seek(0, SeekOrigin.Begin);
            fs.Read(tempReader, 0, headSize);
            fsnHeader = (fsnHead)BytesToStuct(tempReader, typeof(fsnHead));

}


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;
         }

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值