【问题标题】:Read a C++ struct written to a file with C# code使用 C# 代码读取写入文件的 C++ 结构
【发布时间】:2014-06-29 12:12:21
【问题描述】:

我们将要修改的系统由一堆通过文件进行通信的应用程序组成(一些写入文件,其他读取文件等等)。这些应用程序是用 C++ 编写的,其中一个现在要重写为 C#。问题是这个新应用程序需要读取一个文件,该文件包含另一个应用程序使用 C++ fwrite 写入的 C++ 结构。我有一个包含此结构的 C++ 库,我想我可以在我的 C# 代码中引用它,但我无法控制生成该文件的应用程序。

是否有可能,如果是的话,用 C# 代码读取已知的 C++ 结构?

【问题讨论】:

  • 可能与此问题重复:stackoverflow.com/questions/17379492/…
  • 结构体是如何写入文件的?为此使用 XML 等通用数据结构可能更简单。
  • 我错过了什么问题。如果您在 c# 中以相同的顺序创建具有相同字段的相同结构,则读取文件并使用 Marshal.PtrToStructure 将其转换为结构
  • 使用 XML 可能更简单,但如果您仔细阅读问题,它会说“但我无法控制生成文件的应用程序”,这意味着我无法更改生成文件的应用程序。然后无法更改格式
  • 在C#中定义结构,将文件读入byte[],使用Marshal.PtrToStructure。问题是什么?

标签: c# c++ struct marshalling


【解决方案1】:

有多少个结构,有多大?编写自己的代码来读取它们可能更容易,也可能更健壮,比如

static ReadFoo (BinaryReader reader)
{
    Foo foo = new Foo();
    foo.thing = reader.ReadInt32();
    ...
    return foo;
}

【讨论】:

  • 我不这么认为,我读到 C++ 和 C# 写入数据的方式不同(long 可以有不同的大小),你不应该只是以自定义方式读取数据......有编组技术,但我需要了解更多。
  • 你应该知道你的二进制交换标准是什么。这可能会以你的 C++ 编译器已经吐出的任何事实上的标准来冻结它。除非您知道无论如何您都受编译器更改的支配,否则即使没有将不同的语言带入其中。一旦你知道这一点,你就可以编写代码来读取相应的字段。
猜你喜欢
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多