使用Marshal.Copy把Txt行数据转为Struct类型值

添加重要的命名空间:

using System.Runtime.InteropServices;

先建立结构相同(char长度相同)的Struct类型用于转换:


[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Employee
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public char[] EmployeeId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
public char[] LastName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
public char[] FirstName;
//这里省略很多列
}

数据文本类似下面, 如这三列固定长度(6,30,30):

10001 Nick                          Yang
10002 Nick2 Yang
10003 Nick3 Yang

代码获取并转换:


        /// <summary>
/// Get data from interface file
/// </summary>
public void GetDataFromFile()
{
try
{
string path = ConfigurationManager.ConnectionStrings["DataPath"].ConnectionString;
if (File.Exists(path))
{
string[] rows = File.ReadAllLines(path, Encoding.UTF8);
foreach (string row in rows)
{
byte[] bytes = Encoding.UTF8.GetBytes(row);
//以下为重点代码
int size = Marshal.SizeOf(typeof(Employee));
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
//此处已经完成转换
Employee emp = (Employee)Marshal.PtrToStructure(buffer, typeof(Employee));

//省略很多代码
}
catch (Exception ex)
{
throw new Exception("Error when Copying bytes from interface to Employee", ex);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
}
else
{
throw new Exception(string.Format("Error. Can`t not find the interface file at ‘{0}‘", path));
}

}
catch (Exception ex)
{
throw new Exception("Error when getting data from interface file.", ex);
}
}

使用Marshal.Copy把Txt行数据转为Struct类型值,布布扣,bubuko.com

时间: 2024-10-17 00:36:57

使用Marshal.Copy把Txt行数据转为Struct类型值的相关文章

sqlserver中将行数据转为Xml文件格式

将sqlserver中的某张表中的行数据转为XML格式的文件的方法: 语法:select * from  表名   for xml path(xml文件中父节点的名称) 案例: //  在Movie数据库下创建一张用户基本信息表[UserInfoes]: USE [Movie]GOCREATE TABLE [dbo].[UserInfoes]( [userId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [userName] [varchar](50)

C# BitmapData和Marshal.Copy()用法

//此函数用法例子如下: public static byte[] GetGrayArray(Bitmap srcBmp, Rectangle rect) { //将Bitmap锁定到系统内存中,获得BitmapData //这里的第三个参数确定了该图像信息时rgb存储还是Argb存储 BitmapData srcBmpData = srcBmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); //位图中第

MySQL命令行数据操作使用心得(总结版)

Char 0~255 Varchar 0~65535 text 0~65535(只能保存字符) Longtext 0~4294967295(只能保存字符) CMD登陆mysql mysql -u root -p mysql -P 3306 -uroot -p123456  (-P必须大写表示端口) 1,数据库操作databases 创建数据库 create database 显示数据库 show databases 删除数据库 drop database  <数据库名> 连接数据库 Use &

向Sql Server数据库中导入固定格式的txt文本数据

文本数据量比较大的时候,一条条的输入基本不可能,写个程序来中转一下也是很麻烦,幸运的是sql server提供了比较简洁的方法. Bulk insert 表名 from 'C:\你的文本文件.txt' with (FieldterMinator ='以什么符号分割数据', RowterMinator= '以什么符号加\n结尾') --\n是回车的意思,就是回车前面是什么符号,如果没符号直接单引号\n Bulk insert #temp from 'C:\test.txt' with (Field

c#中Marshal.Copy()方法的使用

c#中Marshal.Copy方法的使用 Marshal.copy()方法用来在托管对象(数组)和非托管对象(IntPtr)之间进行内容的复制 函数有很多重载,如下所示: Copy(array<Byte>[]()[], Int32, IntPtr, Int32) 将一维的托管 8 位无符号整数数组中的数据复制到非托管内存指针. Copy(array<Char>[]()[], Int32, IntPtr, Int32) 将数据从一维的托管字符数组复制到非托管内存指针. Copy(ar

在Bootstrap开发框架中使用dataTable直接录入表格行数据(2)--- 控件数据源绑定

在前面随笔<在Bootstrap开发框架中使用dataTable直接录入表格行数据>中介绍了在Web页面中使用Jquery DataTable插件进行对数据直接录入操作,这种处理能够给用户提供较好的数据录入体验,本篇继续上篇的内容,继续介绍这个直接录入的处理操作,主要涉及到控件的初始化和数据源的绑定等操作内容,随着对这个处理的深入了解,我发现可以控制的内容也更加丰富,能够更好的实现各种所需的效果. 1.直接录入数据的界面分析 在之前介绍的数据直接录入处理的时候,界面效果如下所示. 上面的界面处

调用平台删除选择行数据方法注意事项

调用平台智能向导中删除选择行数据方法:网格部件1.DeleteSelectedRows() 时需要将网格部件属性"允许多选"勾选上:如下图所示: 原文地址:http://bbs.delit.cn/thread-712-1-1.html 转载请注明出处: 撰写人:度量科技http://www.delit.cn

SQL查询显示行号、随机查询、取指定行数据

1.显示行号 如果数据没有删除的情况下主键与行号是一致的,但在删除某些数据,行号就与主键不一致了,这时需要查询行号就需要用新的方法,在SQL Server2005之前,需要使用临时表,但在SQL Server2005中,使用ROW_NUMBER()非常方便. select row_number() over (order by UseriD) as rowNum,* from UserInfo 查询结果: 2.随机查询 有的时候我们需要查询出的数据是随机排序的,newid()函数在扫描每条记录时

从$res获取行数据

1 从$res获取行数据的时候,处理 mysql_fetch_row($res),还有三个方法. 2 分别是 3 mysql_fetch_row($res) ,返回一个索引的数组 (推荐.) 4 mysql_fetch_assoc($res) ,返回一个关联数组 5 mysql_fetch_array($res) ,返回索引数组和关联数组 (两套) 6 mysql_fetch_object($res) ,把一行数据,当做一个对象返回.