结构体:探析C#文件方式读写结构体
最近直在研究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#文件方式读写结构体的更多相关文章
- C++结构体对象数组的二进制方式读写
以一个学生信息的结构体数组为例. #include<iostream>#include<string>#include<fstream>using namespac ...
- c++ 读写结构体到文件
可以使用fwrite()将一个结构体写入文件: fwrite(&some_struct,sizeof somestruct,1,fp);对应的fread函数可以再把它读出来,此处fwrite ...
- .NET Micro Framework 4.2 beta 源码探析
.NET Micro Framework 4.2 beta发布已经有一段时间了,一直没有腾出时间研究,昨天因为LWIP协议栈的原因(感觉上一个版本有点问题)刚 下了代码,所以抽空研究了一下. ...
- C语言文件读写(结构体文件)
有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) xiaoming ...
- c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_
1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...
- Golang Json文件解析为结构体工具-json2go
代码地址如下:http://www.demodashi.com/demo/14946.html 概述 json2go是一个基于Golang开发的轻量json文件解析.转换命令行工具,目前支持转换输出到 ...
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- 《用格式化(fprintf和fscanf函数)的方式读写文件》
//用格式化(fprintf和fscanf函数)的方式读写文件 [用格式化的方式向文件中写入数据]#include<stdio.h>#include<stdlib.h> int ...
- 通过替换frm文件方式修改表结构
版本:5.6.16 在自己的虚拟环境中,测试创建一个表,表结构如下:mysql> drop table yoon_temp;Query OK, 0 rows affected (0.09 sec ...
随机推荐
- docker管理工具
Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控制台操作.Swarm集群和服 ...
- ABP文档笔记系列
ABP文档笔记 - 模块系统 及 配置中心 ABP文档笔记 - 事件BUS ABP文档笔记 - 数据过滤 ABP文档笔记 - 规约 ABP文档笔记 - 配置.设置.版本.功能.权限 ABP文档笔记 - ...
- Linux操作系统进程模型分析进程
Linux操作系统简介 Linux拥有现代操作系统的功能,如真正的抢先式多任务处理,支持多用户内存,保护虚拟内存,支持SMP.UP,符合POSIX 标准联网.图形用户接口和桌面环境具有快速性.稳定性等 ...
- 实验与作业(Python)-04 数据类型、数学函数与字符串
截止日期 实验目标 继续熟悉for循环与turtle 数值运算符 math库常用函数 字符串转化为数值类型(int, float, complex) 字符串常用函数 实验内容 任务1.使用for代替w ...
- 解决 oracle IO占用率很高的问题
突然user io占用率很很高,看了一个AWR报告,发现direct path read temp,direct path write temp的的数率很高,后来怀疑是临时表空间不够了,就试着设了一下 ...
- 【我的书】《Unity Shader入门精要》出版上市
重要的事 先说重要的事,就是我的书籍<Unity Shader入门精要>在经过无数次跳票后,终于出版上市了(泪目-)! 购买传送门: 亚马逊 当当 京东 截止到我写这篇文章的时候,京东是没 ...
- 2017腾讯校招面试回忆(成功拿到offer)
我本来报的岗位是企业事业群,后来把我分配到了技术工程群 希望对明年找工作的朋友们能有一点帮助 一面 21号 大概1小时 面试半小时 聊天半小时 1 二叉树的查找 我大笔一挥,在纸上写下了下面的的代码 ...
- Android倒计时器——CountDownTimer
Android倒计时器--CountDownTimer 说明 第一个参数是倒计时的时间 第二个参数是多长时间执行一次回调 /** * @param millisInFuture The number ...
- 凸函数与Jensen不等式
这个是在凸优化里面看的,在EM算法中看有用到,所以用latex写了篇回忆用的小短文,现在不会把latex产生的pdf怎么转变成放到这里的内容. 所以我选择直接贴图. 这个pdf可以在我的资源里找到. ...
- svn数据仓库配置,权限配置
svn服务的开启有两种方式, · 自带的svnserve服务(访问地址类似于svn://192.168.80.18/repos/) · 与Apache配合使用 (访问地址 ...