c# 存取结构体二进制文件

c# 存取结构体 二进制文件(转载) 

from http://www.cnblogs.com/baishahe/archive/2010/03/18/1688995.html

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

    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值