Прочитайте бинарный файл VB 6 в C #

1

У меня есть двоичный файл, написанный приложением VB6, и теперь я хотел бы использовать приложение С# для чтения экспортированного двоичного файла VB6. Я использовал файл Microsoft.VisualBasic.dll в своем проекте С#.

Однако есть некоторая несогласованность данных в приложении С#, но я проверяю его на VB.net, и он работает хорошо. (Я конвертирую с VB6 на VB.net, затем VB.net на С#)

Изображение 174551

Снимок экрана представляет собой результат чтения двоичного файла с помощью приложений С# и 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, но не ожидаемый результат: Изображение 174551

  • 0
    Я заблудился :( ИМХО, вопрос нуждается в большей ясности ... но даже не уверен, что предложить в качестве улучшения .. Для начала, что эти скриншоты показывают?
  • 0
    Снимок экрана представляет результат чтения двоичного файла с использованием приложений C # и VB.Net. VB.Net - мой ожидаемый результат, и теперь мое приложение C # показало результат несоответствия
Показать ещё 5 комментариев
Теги:
vb6

1 ответ

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. Они немного отличаются от типов С#:

  • Данные файла VB6 плотно упакованы, вам нужно [StructLayout(LayoutKind.Sequential, Pack = 1)]
  • Целое число VB6 является short С#
  • A VB6 Long - это С# int
  • VB6 Boolean - это С# short с -1 = True, 0 = False;
  • Строки VB6 имеют фиксированную ширину, вам нужно прочитать их как байт []

Должно быть достаточно, чтобы решить проблему. И, конечно же, имейте в виду, что очень просто использовать сборку VB.NET из программы С#.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню