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

ExpandedBlockStart.gif 代码
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;
        }

    }
}


转载于:https://www.cnblogs.com/baishahe/archive/2010/03/18/1688995.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值