知识大全 探析C#文件方式读写结构体

Posted 结构

篇首语:当你的才华还撑不起你的野心时,你就该努力。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 探析C#文件方式读写结构体相关的知识,希望对你有一定的参考价值。

探析C#文件方式读写结构体  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  最近一直在研究 Net Micro Framework字体文件(tinyfnt) 由于tinyfnt文件头部有一段描述数据 所以很想定义一个结构体 像VC一样直接从文件中读出来 省得用流一个个解析很是麻烦

  没有想到在C#中竟没有直接的指令 想必C#设计者认为提供了流和序列化技术 一切问题都可以迎刃而解了

  在C#中结构体是一个比较复杂的东西 在此之上有很多需要设置的参数 否则用起来就很容易出错 下面是msdn上一段描述 看看也许有助于理解C#语言中的结构体

  通过使用属性可以自定义结构在内存中的布局方式 例如 可以使用 StructLayout(LayoutKind Explicit) 和 FieldOffset 属性创建在 C/C++ 中称为联合的布局

  

  

  [System Runtime InteropServices StructLayout(LayoutKind Explicit)]struct TestUnion[System Runtime InteropServices FieldOffset( )]public int i;[System Runtime InteropServices FieldOffset( )]public double d;[System Runtime InteropServices FieldOffset( )]public char c;[System Runtime InteropServices FieldOffset( )]public byte b;

  在上一个代码段中 TestUnion 的所有字段都从内存中的同一位置开始

  以下是字段从其他显式设置的位置开始的另一个示例

  

  

  [System Runtime InteropServices StructLayout(LayoutKind Explicit)]struct TestExplicit[System Runtime InteropServices FieldOffset( )]public long lg;[System Runtime InteropServices FieldOffset( )]public int i ;[System Runtime InteropServices FieldOffset( )]public int i ;[System Runtime InteropServices FieldOffset( )]public double d;[System Runtime InteropServices FieldOffset( )]public char c;[System Runtime InteropServices FieldOffset( )]public byte b;

  i 和 i 这两个 int 字段共享与 lg 相同的内存位置 使用平台调用时 这种结构布局控制很有用

  我做了一个简单的测试程序 基本达成预定需求 不过程序该方式要求比较苛刻 如果要解析的数据与转换的结构体不匹配就会引发一系列莫名其妙的异常(如内存不可读等等之类) 下面是测试程序的源代码 有兴趣的朋友可以看一看 也希望网友能提出更好的方案

  

  

  

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

  namespace RWFilepublic partial class Form : Formpublic Form ()InitializeComponent();//从文件中读结构体private void button _Click(object sender EventArgs e)string strFile = Application StartupPath + \\\\test dat ;if (!File Exists(strFile))MessageBox Show( 文件不存在 );return;

  FileStream fs = new FileStream(strFile FileMode Open

  FileAccess ReadWrite);TestStruct ts = new TestStruct();byte[] bytData = new byte[Marshal SizeOf(ts)];fs Read(bytData bytData Length);fs Close();ts = rawDeserialize(bytData);textBox Text = ts dTest ToString();textBox Text = ts uTest ToString();textBox Text = Encoding Default GetString(ts bTest);

  //向文件中写结构体private void button _Click(object sender EventArgs e)string strFile = Application StartupPath + \\\\test dat ;FileStream fs = new FileStream(strFile FileMode Create FileAccess Write);TestStruct ts = new TestStruct();ts dTest = double Parse(textBox Text);ts uTest = UInt Parse(textBox Text);ts bTest = Encoding Default GetBytes(textBox Text); byte[] bytData = rawSerialize(ts);fs Write(bytData bytData Length);fs Close();

  [StructLayout(LayoutKind Sequential CharSet = CharSet Ansi)] // Size= public struct TestStruct[MarshalAs(UnmanagedType R )] // FieldOffset( )]  public double dTest;[MarshalAs(UnmanagedType U )] // FieldOffset( )]public UInt uTest;[MarshalAs(UnmanagedType ByValArray SizeConst = )] // FieldOffset( )]public byte[] bTest;

  //序列化public static byte[] rawSerialize(object obj)int rawsize = Marshal SizeOf(obj);IntPtr buffer = Marshal AllocHGlobal(rawsize);Marshal StructureToPtr(obj buffer false);byte[] rawdatas = new byte[rawsize];Marshal Copy(buffer rawdatas rawsize);Marshal FreeHGlobal(buffer);return rawdatas;

  //反序列化public static TestStruct rawDeserialize(byte[] rawdatas)Type anytype = typeof(TestStruct);int rawsize = Marshal SizeOf(anytype);if (rawsize > rawdatas Length) return new TestStruct();IntPtr buffer = Marshal AllocHGlobal(rawsize);Marshal Copy(rawdatas buffer rawsize);object retobj = Marshal PtrToStructure(buffer anytype);Marshal FreeHGlobal(buffer);return (TestStruct)retobj;      

cha138/Article/program/net/201311/12072

相关参考

知识大全 C#高级编程读写文本文件实例

C#高级编程读写文本文件实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  理论上可以使用Fil

知识大全 C# WinForm 读写XML文件

C#WinForm读写XML文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  建立一个WinF

知识大全 C#和C++结构体Socket通信

C#和C++结构体Socket通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近在用C#做

知识大全 用 C# 编程实现读写Binary

用C#编程实现读写Binary  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文给出一个用C#

知识大全 c#在线升级

  面介绍一种用WebServices制作的升级程序通过WebServices升级程序就象读写本机文件一样简单所以我就直接给出代码  WebServices部分代码   

知识大全 JAVA文件操作类,方便读写小文件

JAVA文件操作类,方便读写小文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  package

知识大全 asp FSO 读写文件本文件实现代码

aspFSO读写文件本文件实现代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  asp己经过时

知识大全 Oracle读写文件bfilename

Oracle读写文件bfilename  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Creat

知识大全 Java读写properties文件

Java读写properties文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java代码

知识大全 PHP读写XML文件技巧

PHP读写XML文件技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  常用如下几行  head