Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言读取VB6二进制文件#_C#_Vb.net_Vb6 - Fatal编程技术网

C# 用C语言读取VB6二进制文件#

C# 用C语言读取VB6二进制文件#,c#,vb.net,vb6,C#,Vb.net,Vb6,我有一个由VB6应用程序编写的二进制文件,现在想使用C#应用程序读取VB6导出的二进制文件。我在我的C#项目中使用了Microsoft.VisualBasic.dll 然而,C#应用程序中存在一些数据不一致,但我在VB.net中检查了它,它也运行得很好。(我将VB6转换为VB.net,然后将VB.net转换为C#) 屏幕截图显示了使用C#和VB.Net应用程序读取二进制文件的结果。 Net是我预期的结果,现在我的C#应用程序显示了不一致的结果 这两个值在C#和VB.NET中都是双值,根据我的观

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

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

屏幕截图显示了使用C#和VB.Net应用程序读取二进制文件的结果。 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,但仍然不是我预期的结果:

您可以通过一个小测试程序对此类灾难进行反向工程:

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字符串具有固定宽度,您需要将其作为字节[]读取

应该足够解决这个问题了。当然,请记住,从C#程序使用VB.NET程序集非常简单。

您可以通过一个小测试程序对此类灾难进行反向工程:

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字符串具有固定宽度,您需要将其作为字节[]读取

应该足够解决这个问题了。当然,请记住,从C程序使用VB.NET程序集非常简单。

我迷路了:(嗯,这个问题需要更清楚一些……但我甚至不确定该如何改进……对于初学者来说,这些截图显示了什么?截图表示使用C#和VB.Net应用程序读取二进制文件的结果。VB.Net是我预期的结果,而现在我的C#应用程序显示了不一致的结果。你到底是C吗asting to ValueType?您是否可以在问题中添加文件中的一条记录?如果您可以发布正在写入磁盘的结构的外观,这将非常有用。我猜问题在于VB和C编译同一个结构以具有不同的内存对齐方式。有关如何在中影响结构布局的更多信息可以在这里找到C#:我迷路了:(嗯,这个问题需要更清楚一些……但我甚至不确定该如何改进……对于初学者来说,这些截图显示了什么?截图表示使用C#和VB.Net应用程序读取二进制文件的结果。VB.Net是我预期的结果,而现在我的C#应用程序显示了不一致的结果。你到底是C吗asting to ValueType?您是否可以在问题中添加文件中的一条记录?如果您可以发布正在写入磁盘的结构的外观,这将非常有用。我猜问题在于VB和C编译同一个结构以具有不同的内存对齐方式。有关如何在中影响结构布局的更多信息可以在这里找到C#: