【问题标题】:Reading binary file from delphi从delphi读取二进制文件
【发布时间】:2016-03-15 07:35:51
【问题描述】:

我想先将一些旧文件转换为人类可读的类型,所以在 Delphi 中代码如下:

OpenFileWriteRA(MyF, dd+'invoice.mfs', SizeOf(TFSerialDocEx)) then

然后调用

ReadFile(MyF, vSS1, SizeOf(TFSerialDocEx), nr1, nil);

所以我正在寻找一种使用小程序转换这些文件的方法,我想用 C# 制作它,因为我对 C# 比对 Delphi 更熟悉。 .MFS 文件是用二进制编写的,所以我需要什么将其转换为文本/字符串,我尝试使用简单的二进制转换但它不行,因为参数的 SizeOf Object 似乎在这里或者是大事?

【问题讨论】:

  • 老实说,和 c# 一样——读入结构,以人类可读的方式写出
  • 所以我应该首先将对象(或结构?)转移到 C#?然后尝试阅读它们?
  • 不,我坚持使用 delphi 阅读它们。
  • TFSerialDocEx 很可能是一个记录。但是我们为什么要猜测呢?
  • 请在您的问题中包含定义,并向我们展示您的尝试。

标签: c# delphi


【解决方案1】:

总的来说,我会考虑三种方法:

1.使用 Delphi 代码转换数据

由于您已经拥有用于读取数据的 Delphi 代码和定义的结构,因此使用 Delphi 代码转换数据将是最简单和最快捷的。只需使用您现有的代码阅读它,然后以人类可读的形式输出。例如使用内置的 JSON 库。

2。定义一个等效的格式化 C# 结构并将二进制数据 blit 到该结构上

在 C# 中定义一个格式化结构,该结构具有与放入磁盘的结构相同的二进制布局。这将使用LayoutKind.Sequential,如果Delphi 结构被打包,可能会指定Pack = 1。您可能需要在某些成员上使用MarshalAs 属性来实现二进制等价。然后将结构从磁盘读取到字节数组中。固定该数组,并在固定对象地址上使用Marshal.PtrToStructure 进行反序列化。现在你有了数据,你可以随心所欲地写它。

可以在此处找到示例:Proper struct layout from delphi packed record

3。使用二进制阅读器逐字段读取结构体

您可以使用BinaryReader 一次从流中读取一个字段,而不是声明二进制兼容结构。 ReadReadInt32ReadDouble 等方法调用可让您按照自己的方式处理记录。请记住,这些字段将按照声明 Delphi 记录的顺序写入。如果原始记录是对齐的而不是打包的,您将需要跨过任何填充。同样,一旦您拥有可用于 C# 代码的数据,您就可以随意编写它。

【讨论】:

  • 如果我不熟悉 Delphi,我更喜欢解决方案 3。可能会慢一点,但对于一次性事件来说,这并不重要。但即便如此,我还是会用十六进制编辑器查看我的数据,看看是否有任何填充字节要跳过。
猜你喜欢
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2020-07-14
  • 2018-08-24
相关资源
最近更新 更多