gpt4 book ai didi

c# - 将 C++ 结构编码(marshal)到 C# 的最有效方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:52:32 26 4
gpt4 key购买 nike

我即将开始阅读大量二进制文件,每个文件都有 1000 条或更多记录。不断添加新文件,因此我正在编写一个 Windows 服务来监视目录并在收到新文件时对其进行处理。这些文件是用 C++ 程序创建的。我已经在 C# 中重新创建了结构定义并且可以很好地读取数据,但我担心我这样做的方式最终会杀死我的应用程序。

using (BinaryReader br = new BinaryReader(File.Open("myfile.bin", FileMode.Open)))
{
long pos = 0L;
long length = br.BaseStream.Length;

CPP_STRUCT_DEF record;
byte[] buffer = new byte[Marshal.SizeOf(typeof(CPP_STRUCT_DEF))];
GCHandle pin;

while (pos < length)
{
buffer = br.ReadBytes(buffer.Length);
pin = GCHandle.Alloc(buffer, GCHandleType.Pinned);
record = (CPP_STRUCT_DEF)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(CPP_STRUCT_DEF));
pin.Free();

pos += buffer.Length;

/* Do stuff with my record */
}
}

我认为我不需要使用 GCHandle,因为我实际上并没有与 C++ 应用程序通信,一切都是通过托管代码完成的,但我不知道有替代方法。

最佳答案

使用 Marshal.PtrToStructure 相当慢。我在 CodeProject 上发现了以下文章,该文章比较(和基准测试)读取二进制数据的不同方式非常有帮助:

Fast Binary File Reading with C#

关于c# - 将 C++ 结构编码(marshal)到 C# 的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com