在C#中读取VB 6二进制文件

时间:2014-12-09 01:58:47

标签: c# vb.net vb6

我有一个由VB6应用程序编写的二进制文件,现在想使用C#应用程序来读取VB6导出的二进制文件。我已将Microsoft.VisualBasic.dll用于我的C#项目。

然而,在C#应用程序中存在一些数据不一致但我在VB.net中检查它并且它也很好用。 (我将VB6转换为VB.net,然后将VB.net转换为C#)

enter image description here

屏幕截图表示使用C#和VB.Net应用程序读取二进制文件的结果。 VB.Net是我的预期结果,现在我的C#应用​​程序显示不一致结果

两者都是C#和VB.NET中的双重值,根据我的观察,int,string值看起来很好。

在C#中,我使用的语句如下所示,BinaryDetails是struct,里面有很少的双变量

ValueType DetailsValueType = (ValueType)BinaryDetails;
FileSystem.FileOpen(FileNumber, FileName, OpenMode.Binary, OpenAccess.Read);
FileSystem.FileGet(FileNumber, ref DetailsValueType);

我已将C#中的数据类型从double更改为float,仍然不是我预期的结果: enter image description here

1 个答案:

答案 0 :(得分:4)

您可以通过一些测试程序对这种事故进行反向工程:

class Program {
    static void Main(string[] args) {
        var value1 = 3.49563395756763E-310;
        var bytes1 = BitConverter.GetBytes(value1);
        Console.WriteLine(BitConverter.ToString(bytes1));
        var value2 = 101.325;
        var bytes2 = BitConverter.GetBytes(value2);
        Console.WriteLine(BitConverter.ToString(bytes2));
    }
}

输出:

CC-CC-CC-54-59-40-00-00
CD-CC-CC-CC-CC-54-59-40

请注意,您是如何在正确的轨道上,从文件中读取正确的字节值。那些双打有CC-54-59-40的共同点。只是您读取数据未对齐。你开始阅读太晚了,关闭了2个字节。

那是因为您的BinaryDetails与文件中的数据不完全匹配。请记住,您必须假设该文件包含VB6数据类型。它们与C#类型略有不同:

  • VB6文件数据紧凑,您需要[StructLayout(LayoutKind.Sequential, Pack = 1)]
  • VB6整数是C#short
  • VB6 Long是C#int
  • VB6布尔值是C#short,其中-1 = True,0 = False;
  • VB6字符串具有固定宽度,您需要将它们读作byte []

应该足以解决问题。当然要记住,使用C#程序中的VB.NET程序集非常简单