从delphi读取二进制文件

时间:2016-03-15 07:35:52

标签: c# delphi

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

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

然后调用

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

所以我正在寻找一种方法来使用小型程序来转换这些文件我希望用C#来实现它,因为我对C#比熟悉Delphi更熟悉。 .MFS文件是用二进制文件编写的,所以我需要将它转换为文本/字符串,我尝试使用简单的二进制转换但是它不行,因为看起来参数中的SizeOf对象在这里是重要的还是?

1 个答案:

答案 0 :(得分:4)

从广义上讲,我会考虑三种方法:

<强> 1。使用Delphi代码转换数据

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

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

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

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

第3。使用二进制读取器按字段读取结构字段

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