最近直在研究Net Micro Framework字体文件(tinyfnt)由于tinyfnt文件头部有段描述数据所以很想

定义个结构体像VC样直接从文件中读出来省得用流个个解析很是麻烦   没有想到在中竟没有直接指令想必设

计者认为提供了流和序列化技术切问题都可以迎刃而解了

  在中结构体是个比较复杂东西在此的上有很多需要设置参数否则用起来就很容易出错下面是msdn上段描述

看看也许有助于理解C#语言中结构体

  通过使用属性可以自定义结构在内存中布局方式例如可以使用 StructLayout(LayoutKind.Explicit) 和

FieldOff 属性创建在 C/C 中称为联合布局

[.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]

struct TestUnion

{

[.Runtime.InteropServices.FieldOff(0)]

public i;

[.Runtime.InteropServices.FieldOff(0)]

public double d;

[.Runtime.InteropServices.FieldOff(0)]

public char c;

[.Runtime.InteropServices.FieldOff(0)]

public b;

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

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

[.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]

struct TestExplicit

{

[.Runtime.InteropServices.FieldOff(0)]

public long lg;

[.Runtime.InteropServices.FieldOff(0)]

public i1;

[.Runtime.InteropServices.FieldOff(4)]

public i2;

[.Runtime.InteropServices.FieldOff(8)] 

public double d;

[.Runtime.InteropServices.FieldOff(12)]

public char c;

[.Runtime.InteropServices.FieldOff(14)]

public b;

}  i1 和 i2 这两个 字段共享和 lg 相同内存位置使用平台时这种结构布局控制很有用

  我做了个简单测试基本达成预定需求不过该方式要求比较苛刻如果要解析数据和转换结构体不匹配就会

引发系列莫名其妙异常(如内存不可读等等的类)下面是测试源代码有兴趣朋友可以看看也希望网友能提出更好方



using ;

using .Collections.Generic;

using .ComponentModel;

using .Data;

using .Drawing;

using .Text;

using ..Forms;

using .IO;

using .Runtime.InteropServices;

RWFile

{

public partial Form1 : Form

{

public Form1

{

InitializeComponent;

}

//从文件中读结构体

private void button1_Click(object sender, EventArgs e)

{

strFile = Application.StartupPath + "  est.dat";

(!File.Exists(strFile))

{

MessageBox.Show("文件不存在");



}

FileStream fs = FileStream(strFile, FileMode.Open,

FileAccess.ReadWrite);

TestStruct ts = TestStruct;

bytData = [Marshal.SizeOf(ts)];

fs.Read(bytData, 0, bytData.Length);

fs.Close;

ts = rawDeserialize(bytData);

textBox1.Text = ts.dTest.;

textBox2.Text = ts.uTest.;

textBox3.Text = Encoding.Default.GetString(ts.bTest);

}

//向文件中写结构体

private void button2_Click(object sender, EventArgs e)

{

strFile = Application.StartupPath + "  est.dat";

FileStream fs = FileStream(strFile, FileMode.Create ,

                      FileAccess.Write);

TestStruct ts = TestStruct;

ts.dTest = double.Parse(textBox1.Text);

ts.uTest = UInt16.Parse(textBox2.Text);

ts.bTest = Encoding.Default.GetBytes(textBox3.Text);

bytData = rawSerialize(ts);

fs.Write(bytData, 0, bytData.Length);

fs.Close;

}

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)] //,Size=16

public struct TestStruct

{

[MarshalAs(UnmanagedType.R8)] //,FieldOff(0)] 

public double dTest;

[MarshalAs(UnmanagedType.U2)] //, FieldOff(8)]

public UInt16 uTest;

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]

                 //, FieldOff(10)]

public bTest; 

}

//序列化

public rawSerialize(object obj)

{

rawsize = Marshal.SizeOf(obj);

IntPtr buffer = Marshal.AllocHGlobal(rawsize);

Marshal.StructureToPtr(obj, buffer, false);

rawdatas = [rawsize];

Marshal.Copy(buffer, rawdatas, 0, rawsize);

Marshal.FreeHGlobal(buffer);

rawdatas;

}

//反序列化

public TestStruct rawDeserialize( rawdatas)

{

Type anytype = typeof(TestStruct);

rawsize = Marshal.SizeOf(anytype);

(rawsize > rawdatas.Length) TestStruct;

IntPtr buffer = Marshal.AllocHGlobal(rawsize);

Marshal.Copy(rawdatas, 0, buffer, rawsize);

object retobj = Marshal.PtrToStructure(buffer, anytype);

Marshal.FreeHGlobal(buffer);

(TestStruct)retobj;

}   

}

}

结构体:探析C#文件方式读写结构体的更多相关文章

  1. C++结构体对象数组的二进制方式读写

    以一个学生信息的结构体数组为例. #include<iostream>#include<string>#include<fstream>using namespac ...

  2. c++ 读写结构体到文件

    可以使用fwrite()将一个结构体写入文件:  fwrite(&some_struct,sizeof somestruct,1,fp);对应的fread函数可以再把它读出来,此处fwrite ...

  3. .NET Micro Framework 4.2 beta 源码探析

    .NET Micro Framework 4.2 beta发布已经有一段时间了,一直没有腾出时间研究,昨天因为LWIP协议栈的原因(感觉上一个版本有点问题)刚 下了代码,所以抽空研究了一下.      ...

  4. C语言文件读写(结构体文件)

    有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) xiaoming ...

  5. c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_

    1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...

  6. Golang Json文件解析为结构体工具-json2go

    代码地址如下:http://www.demodashi.com/demo/14946.html 概述 json2go是一个基于Golang开发的轻量json文件解析.转换命令行工具,目前支持转换输出到 ...

  7. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  8. 《用格式化(fprintf和fscanf函数)的方式读写文件》

    //用格式化(fprintf和fscanf函数)的方式读写文件 [用格式化的方式向文件中写入数据]#include<stdio.h>#include<stdlib.h> int ...

  9. 通过替换frm文件方式修改表结构

    版本:5.6.16 在自己的虚拟环境中,测试创建一个表,表结构如下:mysql> drop table yoon_temp;Query OK, 0 rows affected (0.09 sec ...

随机推荐

  1. Java关键字---this的由来和其三大作用

    [声明]欢迎转载,但请保留文章原始出处→_→ 秦学苦练:http://www.cnblogs.com/Qinstudy/ 文章来源:http://www.cnblogs.com/Qinstudy/p/ ...

  2. Arrays的二分查找

    二分查找也称为折半查找,是对有序元素查找的一种算法,在查找的过程中,不断的将搜索长度减半,因此效率不错.Java的JDK提供了二分法查找的算法,使用的方法是Arrays.binarySearch(). ...

  3. linux系统性能监控--CPU利用率

    在对系统的方法化分析中,首要且最基本的工具之一常常是对系统的 CPU利用率进行简单测量. Linux以及大多数基于 UNIX的操作系统都提供了一条命令来显示系统的平均负荷(loadaverage) . ...

  4. 深入Java虚拟机(4)——网络移动性

    一.软件应用程序发展的几个阶段 软件应用程序发展经历了如下几个阶段: 服务于多个终端用户的大型计算机系统 孤立的个人计算机上运行孤立的软件 客户机/服务器模式 分布式处理模式 内容服务模式(网络移动性 ...

  5. hive高阶1--sql和hive语句执行顺序、explain查看执行计划、group by生成MR

    hive语句执行顺序 msyql语句执行顺序 代码写的顺序: select ... from... where.... group by... having... order by.. 或者 from ...

  6. PHP和MySQL Web开发学习笔记介绍

    前言 从2016年2月1日开始,之后的几个月左右的时间里,我会写一个系列的PHP和MySQL Web开发的学习笔记.我之前一直从事Java语言的开发工作,最近这段时间非常想学习一门语言,就选择了PHP ...

  7. CCSpriteBatchNode中存放元素的一点理解

    该对象只能包含基于CCSprite的对象,并且该要求适用于一切子孙对象.即加入CCSpriteBatchNode的任何对象都必须是CCSprite或其子类. 比如CCSpriteBatchNode包含 ...

  8. springMVC源码分析--DispatcherServlet请求获取及处理

    在之前的博客springMVC源码分析--容器初始化(二)DispatcherServlet中我们介绍过DispatcherServlet,是在容器初始化过程中出现的,我们之前也说过Dispatche ...

  9. MapReduce:并行计算框架

    MapReduce 是 Hadoop 的核心组成,是专用于进行数据计算的.重点掌握实现 MapReduce 算法的步骤,掌握 map.reduce 函数的特点.如何写函数. 如果我们把 MapRedu ...

  10. 11 吐司 Toast 代码案例

    package com.qf.day11_toast_demo05; import android.app.Activity; import android.graphics.Color; impor ...