【问题标题】:Read memory mapped file created by c++ into c#将c++创建的内存映射文件读入c#
【发布时间】:2013-09-26 04:17:08
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: c# c++ memory-mapped-files


    【解决方案1】:

    首先,使用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);
    // ...
    

    【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2016-12-08
    • 2016-04-20
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多