zoukankan      html  css  js  c++  java
  • 使用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);
                }
            }
  • 相关阅读:
    手把手教你如何安装Pycharm
    虚拟机的安装
    将BUG管理工具(禅道)部署到服务器(测试服务器、云服务器)
    XMind入门教程
    测试流程中的问题
    MySQL安装
    SDK?JDK?JDK 下载、安装、配置图文教程
    tomcat是什么?Tomcat 下载、安装、配置图文教程
    转:如何准备性能测试数据
    转:性能测试用例设计策略
  • 原文地址:https://www.cnblogs.com/xachary/p/3745063.html
Copyright © 2011-2022 走看看