C#中byte[] 转 double[] 或 int[] 或 struct结构体
方法:使用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的实现 效率对比
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2016-06-28 用CHttpFile实现简单的GET/POST数据【转】
2007-06-28 64位进程调用32位dll的解决方法