У меня есть двоичный файл, написанный приложением VB6, и теперь я хотел бы использовать приложение С# для чтения экспортированного двоичного файла VB6. Я использовал файл Microsoft.VisualBasic.dll в своем проекте С#.
Однако есть некоторая несогласованность данных в приложении С#, но я проверяю его на VB.net, и он работает хорошо. (Я конвертирую с VB6 на VB.net, затем VB.net на С#)
Снимок экрана представляет собой результат чтения двоичного файла с помощью приложений С# и VB.Net. VB.Net - мой ожидаемый результат, и теперь мое приложение С# показывало результат несогласованности
Оба являются двойными значениями в С# и VB.NET, и на основе моего наблюдения значения int, string выглядят отлично.
В С# я использовал оператор, показанный ниже, BinaryDetails является структурой и внутри имеет несколько двойных переменных
ValueType DetailsValueType = (ValueType)BinaryDetails;
FileSystem.FileOpen(FileNumber, FileName, OpenMode.Binary, OpenAccess.Read);
FileSystem.FileGet(FileNumber, ref DetailsValueType);
Я изменяю тип данных в С# от 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. Они немного отличаются от типов С#:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
short
С#int
short
с -1 = True, 0 = False;Должно быть достаточно, чтобы решить проблему. И, конечно же, имейте в виду, что очень просто использовать сборку VB.NET из программы С#.