0

基本上我有一个使用 c++ 内存映射库创建的二进制文件。我有关于 c++ 中结构的所有信息。我正在尝试使用 c# 中的内存映射库读取该二进制文件。有人可以向我展示任何展示如何实现这一目标的文章/博客吗?

我正在努力将 c++ 结构映射到 c# 结构以及读取和映射内容所需的步骤。

提前致谢。

4

1 回答 1

0

首先,用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);
// ...
于 2013-09-26T04:27:11.120 回答