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

转载连接: 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;
        }

    }
}

结构体在C语言是一种用户自定义的数据类型,可以包含多个不同类型的数据成员。结构体的内存布局是按照成员的先后顺序存储的,而且每个成员的内存地址是连续的。 在C语言结构体二进制表示是根据其成员的数据类型和内存布局来确定的。对于每个成员变量,都会有一定大小的内存空间来存储其值。在内存结构体的数据成员是按照其定义的顺序依次排列的,每个成员变量的内存地址是按照连续的方式分配的。 当我们将一个结构体对象写入磁盘或进行网络传输时,需要将结构体对象转换为二进制数据。这个过程称为序列化。在序列化结构体时,需要按照成员的内存布局和数据类型来将结构体的数据逐个转换为对应的二进制表示。而在接收到二进制数据后,需要进行反序列化,将二进制数据还原为结构体对象。 在C语言,可以使用指针来操作结构体对象的二进制数据。通过指针,可以获取结构体对象的内存地址,并直接对其进行操作。同时,也可以将指针强制类型转换为其他类型的指针,以便对结构体对象进行更灵活的操作。 总之,结构体在C语言二进制表示是根据其成员的数据类型和内存布局来确定的,可以通过序列化和反序列化将结构体转换为二进制数据,并且可以使用指针来操作结构体对象的二进制数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值