【发布时间】:2013-09-26 04:17:08
【问题描述】:
基本上我有一个使用 c++ 内存映射库创建的二进制文件。我有关于 c++ 中结构的所有信息。我正在尝试使用 c# 中的内存映射库读取该二进制文件。有人可以向我展示任何文章/博客来展示如何实现这一目标吗?
我正在努力将 c++ 结构映射到 c# 结构以及读取和映射内容所需的步骤。
提前致谢。
【问题讨论】:
标签: c# c++ memory-mapped-files
基本上我有一个使用 c++ 内存映射库创建的二进制文件。我有关于 c++ 中结构的所有信息。我正在尝试使用 c# 中的内存映射库读取该二进制文件。有人可以向我展示任何文章/博客来展示如何实现这一目标吗?
我正在努力将 c++ 结构映射到 c# 结构以及读取和映射内容所需的步骤。
提前致谢。
【问题讨论】:
标签: c# c++ memory-mapped-files
首先,使用FileStream 打开文件。
var stream = new FileStream(path, FileMode.Open, FileAccess.Read);
然后从该流中实例化一个BinaryReader。这不是完全必需的,但可以更轻松地处理二进制数据。
var reader = new BinaryReader(stream);
接下来,根据Marshal.SizeOf 的指示,读入结构所需的尽可能多的字节:
var bytes = reader.ReadBytes(Marshal.SizeOf(typeof (MyStruct)));
然后,我们使用GCHandle.Alloc“固定”该托管内存,以便 GC 不会移动它:
var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
最后,我们将该缓冲区转换为托管结构,使用Marshal.PtrToStructure:
var myStruct = (MyStruct)Marshal.PtrToStructure(
handle.AddrOfPinnedObject(), typeof (MyStruct));
别忘了释放 GCHandle:
handle.Free();
return theStructure;
}
Here is 包含在泛型函数中的部分示例。
虽然我还没有尝试过,但我相当有信心这也适用于使用 MemoryMappedFile 和调用 CreateViewStream(您将其传递给 BinaryReader。)
var mmfile = MemoryMappedFile.CreateFromFile(path);
var stream = mmfile.CreateViewStream();
var reader = new BinaryReader(stream);
// ...
【讨论】: