方法:使用C#调用C++ memcpy实现各种参数类型的内存拷贝

using System.Runtime.InteropServices;

public class GlbWSGridDataset

{

   [DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public static extern void MemCopy(int[] dest, byte[] src, int count);//字节数组到整形数组的拷贝

[DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public static extern void MemCopy(double[] dest, byte[] src, int count);//字节数组到double数组的拷贝

[DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
        public unsafe static extern void MemCopy(ref GlbcwSGridFacet dest, byte[] src, int count);//注意只有结构体能这么做,class不可以

  public void test()

  {    

    string filepath = @"c:\ddd.sgr";
              FileStream fs = new FileStream(filepath, FileMode.Open);//初始化文件流
              BinaryReader binReader = new BinaryReader(fs);

    {///byte[] 转 double[]

      int zcount = (grid.ni) * (grid.nj) * (grid.nk + 1);
      double[] zArray = new double[zcount * 4];
      System.Diagnostics.Trace.Assert(zArray != null);
      int zlen = zcount * 4 * sizeof(double);
      byte[] zdata = new byte[zlen];
      zdata = binReader.ReadBytes(zlen);

      // 调用c++的memcopy实现拷贝
      MemCopy(zArray, zdata, zlen);

    }

    {///byte[] 转 int[]

      int clrcount = (NI) * (NJ) * (NK);
                clrArray = new int[clrcount];
                System.Diagnostics.Trace.Assert(clrArray != null);
                int len = clrcount * sizeof(int);
                byte[] clrdata = new byte[len];
                clrdata = binReader.ReadBytes(len);
                // 拷贝整型数组
                MemCopy(clrArray, clrdata, len);

    }

    

    {///byte[] 转struct

      GlbcwSGridFacet bounderCellIndexs = new GlbcwSGridFacet();

      // 使用Marshal.SizeOf来计算struct的大小

      int len = System.Runtime.InteropServices.Marshal.SizeOf(typeof(GlbcwSGridFacet))

      byte[] data= new byte[len];
                System.Diagnostics.Trace.Assert(data!= null);
                data= binReader.ReadBytes(len);
                // 用不安全的拷贝方式memcpy  效率最快
                MemCopy(ref bounderCellIndexs, data, len);

    }

       // 关闭文件   

binReader.Close();
              fs.Close();

  }

}

参考 https://www.cnblogs.com/timeObjserver/p/7040966.html?utm_source=itdadao&utm_medium=referral  C#调用C++ memcpy实现各种参数类型的内存拷贝 VS marshal.copy的实现 效率对比

C#中byte[] 转 double[] 或 int[] 或 struct结构体的更多相关文章

  1. C语言 Struct 结构体在 Java 中的体现

    大一整个学期完成了 C 语言的学习,大二就进入了Java 的学习. 和C语言一样,我们都会尝试写一个小小的学生管理系统什么的,学习过 C 语言同学知道,在管理系统中 Struct 结构体是个很好用的东 ...

  2. java 基础--8 种基本数据类型:整型、浮点型、布尔型、字符型 整型中 byte、short、int、long 的取值范围 什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额?

     一.8种基本数据类型(4整,2浮,1符,1布): 整型:byte(最小的数据类型).short(短整型).int(整型).long(长整型): 浮点型:float(浮点型).double(双精度浮点 ...

  3. struct结构体在c和c++中的差别

    非常多次遇到这个struct的问题,今天在这里简单总结一下我的理解 一.struct在C 中的使用 1.单独使用struct定义结构体类型 struct Student { int id; int n ...

  4. C语言中free()函数释放struct结构体中的规律

    并不是什么新鲜的事情,不过值得注意.首先我们知道,在使用struct来定义并声明一个变量时,将会自动划分出一个连续的储存空间(虽然根据某些对齐原则会出现内存间隙,但是大体上来说还是连续的)这一块连续空 ...

  5. [转载] java中byte数组与int,long,short间的转换

    文章转载自http://blog.csdn.net/leetcworks/article/details/7390731 package com.util; /** * * <ul> * ...

  6. java中byte数组与int,long,short间的转换

    http://blog.csdn.net/leetcworks/article/details/7390731 package com.util; /** * * <ul> * <l ...

  7. C结构体中数据的内存对齐问题

    转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...

  8. C#中结构体定义并转换字节数组

    最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...

  9. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

随机推荐

  1. linux环境下source vimrc提示错误unexpected token `"autocmd"'

    编辑完vimrc之后,使用source /etc/vimrc之后报错: $ source /etc/vimrc bash: /etc/vimrc: line 15: syntax error near ...

  2. BZOJ4556 HEOI2016字符串

    没错,又是这题,使用后缀自动机,反向建树,主席树维护right集合. By:大奕哥 #include<bits/stdc++.h> using namespace std; ; ]; ch ...

  3. android的AsyncTask.get()方法会阻塞UI线程

    AsyncTask.get()方法, 是有阻塞UI的能力的.

  4. BZOJ4227 : 城市

    首先一遍Dijkstra求出S到每个点的最短路,并建出最短路图. 那么对于一条边,求在这条边不能使用的情况下,到首都S的最短时间会变长的点的数目,等价于求去掉这条边后在最短路图中不能从S出发到达的点的 ...

  5. 使用 IntraWeb (1) - 先测试如何部署为 Asp.Net 的应用

    IntraWeb 14 可以部署为 Asp.Net 的应用程序, 需要 NET Framework 4.5 和 ASP.NET MVC 4 或之上版本的支持; 这下, 只能用虚拟主机的朋友有福了! 我 ...

  6. THE TOOLS TO MANAGE YOUR DATA ACROSS CLOUDS

    http://blog.grexit.com/manage-data-across-clouds/ That the average small business uses a cloud servi ...

  7. Oracle绝对值函数

    1.绝对值:abs() select abs(-2) value from dual; 2.取整函数(大):ceil() select ceil(-2.001) value from dual;(-2 ...

  8. CentOS5内核版本2.6.18升级至3.6.4 转

    http://www.kvm.la/centos5-upgrade-kernel-3-6.html

  9. delphi 主线程向子线程发送消息

    while True do begin if not PeekMessage(msg,0,0,0,PM_REMOVE) then begin case MsgWaitForMultipleObject ...

  10. [vs2013]远程服务器调试

    摘要 有时遇到比较奇葩的问题,比如本地程序正常运行,在服务器上不可以,如果日志也不起作用,那么远程调试就非常必要了,在服务器上安装vs,是比较费力费时的. 步骤 1.找到vs安装目录,一般默认安装在c ...