我是靠谱客的博主 野性摩托,最近开发中收集的这篇文章主要介绍使用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类型值的全部内容,希望文章能够帮你解决使用Marshal.Copy把Txt行数据转为Struct类型值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部