C# 用C语言读取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中都是双值,根据我的观察,int和string值看起来不错 在C#中,我使用了如下所示的语句,BinaryDetails是struct,内部几乎没有双变量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中都是双值,根据我的观
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#
,其中-1=True,0=False李>short
- 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#
,其中-1=True,0=False李>short
- 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#: