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