zoukankan      html  css  js  c++  java
  • c# 存取结构体 二进制文件

    代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.IO;

    namespace StructTest
    {
        
    public partial class Form1 : Form
        {

            
    string filename = @"d:\poi.st";

            
    #region 结构体

            
    //90

            [StructLayout(LayoutKind.Sequential), Serializable]
            
    public struct MY_STRUCT
            {
                
    public double x;          //点的经度坐标
                public double y;          //点的纬度坐标
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]
                
    public string Name;        //Name[40]; //名称
                public long PointID;  //点的ID号
                public long TypeCode; //客户不使用该字段
            }

            
    #endregion

            
    public Form1()
            {
                InitializeComponent();
            }

            
    private void button1_Click(object sender, EventArgs e)
            {
                MY_STRUCT[] arr 
    = new MY_STRUCT[2];

                MY_STRUCT np 
    = new MY_STRUCT();
                np.x 
    = 114.123456;
                np.y 
    = 23.56789;
                np.Name 
    = "珠海市政府";
                np.PointID 
    = Convert.ToInt64(1234);
                np.TypeCode 
    = Convert.ToInt64(65);

                arr[
    0= np;

                np 
    = new MY_STRUCT();
                np.x 
    = 115.123456;
                np.y 
    = 24.56789;
                np.Name 
    = "珠海市政府2";
                np.PointID 
    = Convert.ToInt64(1235);
                np.TypeCode 
    = Convert.ToInt64(66);

                arr[
    1= np;

                
    int structSize = Marshal.SizeOf(typeof(MY_STRUCT));
                
    byte[] temp = new byte[structSize * arr.Length];
                
    byte[] temp1 = Struct2Byte(arr[0]);
                
    byte[] temp2 = Struct2Byte(arr[1]);

                Array.Copy(temp1, 
    0, temp, 0, temp1.Length);
                Array.Copy(temp2, 
    0, temp, structSize, temp2.Length);

                WriteInfo(temp);
            }


            
    public void WriteInfo(byte[] bt)
            {
                
    if (File.Exists(filename))
                {
                    File.Delete(filename);
                    
    return;
                }

                FileStream fs 
    = new FileStream(filename, FileMode.Create);
                BinaryWriter bw 
    = new BinaryWriter(fs);
                bw.Write(bt);
                bw.Flush();

                bw.Close();
                fs.Close();

                MessageBox.Show(
    "保存成功!");
            }

            
    public byte[] ReadInfo(string file)
            {
                FileStream fs 
    = new FileStream(file, FileMode.Open);
                BinaryReader br 
    = new BinaryReader(fs);

                
    byte[] bt = br.ReadBytes(144);
                br.Close();
                fs.Close();

                
    return bt;
            }

            
    private void button2_Click(object sender, EventArgs e)
            {
                
    byte[] bt = ReadInfo(filename);

                
    int structSize = Marshal.SizeOf(typeof(MY_STRUCT));
                
    int num = bt.Length / structSize;

                
    for (int i = 0; i < num; i++)
                {
                    
    byte[] temp = new byte[structSize];
                    Array.Copy(bt, i 
    * structSize, temp, 0, structSize);

                    MY_STRUCT np 
    = new MY_STRUCT();
                    np 
    = Byte2Struct(temp);
                }
            }


            
    private MY_STRUCT Byte2Struct(byte[] arr)
            {
                
    int structSize = Marshal.SizeOf(typeof(MY_STRUCT));
                IntPtr ptemp 
    = Marshal.AllocHGlobal(structSize);
                Marshal.Copy(arr, 
    0, ptemp, structSize);
                MY_STRUCT rs 
    = (MY_STRUCT)Marshal.PtrToStructure(ptemp, typeof(MY_STRUCT));
                Marshal.FreeHGlobal(ptemp);
                
    return rs;
            }

            
    private byte[] Struct2Byte(MY_STRUCT s)
            {
                
    int structSize = Marshal.SizeOf(typeof(MY_STRUCT));
                
    byte[] buffer = new byte[structSize];
                
    //分配结构体大小的内存空间 
                IntPtr structPtr = Marshal.AllocHGlobal(structSize);
                
    //将结构体拷到分配好的内存空间 
                Marshal.StructureToPtr(s, structPtr, false);
                
    //从内存空间拷到byte数组 
                Marshal.Copy(structPtr, buffer, 0, structSize);
                
    //释放内存空间 
                Marshal.FreeHGlobal(structPtr);
                
    return buffer;
            }

        }
    }


  • 相关阅读:
    Django框架----路由系统(详细)
    Django框架----路由系统、视图和模板(简单介绍)
    Django框架----模板继承和静态文件配置
    Django框架----模板语法
    毕昇杯之无线通信模块
    新版本ubuntu13.10软件安装
    毕昇杯总结1
    调试程序的方法总结
    新年,新气象
    基于51,人体红外感应和RC522的门禁系统
  • 原文地址:https://www.cnblogs.com/baishahe/p/1688995.html
Copyright © 2011-2022 走看看