我有一个由VB6应用程序编写的二进制文件,现在想使用C#应用程序来读取VB6导出的二进制文件。我已将Microsoft.VisualBasic.dll用于我的C#项目。
然而,在C#应用程序中存在一些数据不一致但我在VB.net中检查它并且它也很好用。 (我将VB6转换为VB.net,然后将VB.net转换为C#)
屏幕截图表示使用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,仍然不是我预期的结果:
答案 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#类型略有不同:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
short
int
short
,其中-1 = True,0 = False; 应该足以解决问题。当然要记住,使用C#程序中的VB.NET程序集非常简单
。