码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-05-26 23:25:14      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:style   c   class   blog   code   java   

添加重要的命名空间:

using System.Runtime.InteropServices;

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

bubuko.com,布布扣
[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;
        //这里省略很多列
     }
bubuko.com,布布扣

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

10001 Nick                          Yang                          
10002 Nick2                         Yang                          
10003 Nick3                         Yang                          

代码获取并转换:

bubuko.com,布布扣
        /// <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);
            }
        }
bubuko.com,布布扣

 

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

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

标签:style   c   class   blog   code   java   

原文地址:http://www.cnblogs.com/xachary/p/3745063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!