我想先将一些旧文件转换为人类可读类型,因此在Delphi中代码如下:
OpenFileWriteRA(MyF, dd+'invoice.mfs', SizeOf(TFSerialDocEx)) then
然后调用
ReadFile(MyF, vSS1, SizeOf(TFSerialDocEx), nr1, nil);
所以我正在寻找一种方法来使用小型程序来转换这些文件我希望用C#来实现它,因为我对C#比熟悉Delphi更熟悉。 .MFS文件是用二进制文件编写的,所以我需要将它转换为文本/字符串,我尝试使用简单的二进制转换但是它不行,因为看起来参数中的SizeOf对象在这里是重要的还是?
答案 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
一次从流中读取一个字段,而不是声明二进制兼容结构。像Read
,ReadInt32
,ReadDouble
等方法调用可让您按照记录的方式进行操作。请记住,字段将按照声明Delphi记录的顺序编写。如果原始记录是对齐而不是打包,则需要跳过任何填充。同样,一旦您拥有C#代码的数据,您就可以随意编写。