Member 14100511 Ответов: 3

Как я могу прочитать смешанные байтовые и одинарные данные точности из файла в VB.NET-что?


Я старый VB-Хак, много лет ушедший на пенсию, недавно побудивший написать какой-то код для создания дополнительных утилит для игры.
Файл игры содержит переменное число фрагментов переменной длины, два из которых содержат массивы с плавающей запятой. Написав приложения в VB6 для чтения и изменения файлов, которые работают довольно хорошо, я подумал, что обновлю свои навыки и перепишу их в VB.net чтобы мне не пришлось обременять своих (потенциальных) пользователей необходимостью устанавливать общий диалог и другие OCX.
Я провел три дня, прокладывая себе путь через тупую, неясную и совершенно сбивающую с толку документацию по обработке файлов в VB.net не изучая, как я могу читать/записывать строковые, байтовые и плавающие данные из одного и того же файла.
В настоящее время я использую input для захвата некоторых строковых данных, внутри которых я получаю указатели на данные float. Затем я использую SEEK и GET для чтения моих float-массивов и еще раз ищу, а затем ставлю, чтобы переписать измененные данные.
Кто-нибудь может дать совет, пожалуйста?

Что я уже пробовал:

Я просмотрел файловые потоки и свой компьютер.файловая система.FileGet, но я нахожу свой мозг запутанным из-за необходимости читать разные биты файла по-разному.

CPallini

Поскольку вам нужно выучить новый язык, почему бы вам не начать непосредственно с C# (я думаю, что вы могли бы получить лучшую помощь)?

3 Ответов

Рейтинг:
2

Maciej Los

Я думал о ваших требованиях к хранению и извлечению данных игры...

Я бы начал с того, что Сериализация (Visual Basic) | Microsoft Docs[^], особенно о Класс BinaryFormatter (System.Runtime.Сериализация.Форматеры.Двоичные) | Майкрософт Документы[^]. Это позволяет вам записывать и считывать любые данные и позволяет избежать проблем с преобразованием типов.

Удачи вам!


Рейтинг:
1

OriginalGriff

Взгляните на это: ByteArrayBuilder - строковый конструктор для байтов[^] код написан на языке C#, но Преобразователь кода C# в VB и VB в C# – Telerik[^] должно помочь, если вы не можете решить это.

На самом деле чтение и запись файла, полного байтов, очень просты: Файл.Метод ReadAllBytes(String) (System.IO) | Microsoft Docs[^] и Файл.Метод WriteAllBytes(String, Byte []) (System.IO) | Microsoft Docs[^] сделает это за вас. Как только вы получите его в виде массива байтов, его довольно легко обработать в "собственные данные".


Maciej Los

5ed!

Member 14100511

Спасибо за ответ, оригинальный Грифф. Мацей Лос - я понятия не имею, что такое 5ed! это должно означать.
Так что, может быть, я не очень хорошо написал свой qyestion. Моя проблема заключается не в том, как записать массив в файл, а в том, как я читаю строку символов, затем сбрасываю указатель файла и читаю байты, затем сбрасываю указатель файла и читаю массив поплавков, читаю еще несколько байтов, сбрасываю указатель файла и читаю другой массив поплавков. Как только мне это удастся, я захочу сбросить указатель и переписать два массива float, и если мне придется выяснить, как преобразовать C# (с которым я не знаком) в VB.NET (с которым я не знаком) я могу предвидеть, что никогда не завершу проект.

OriginalGriff

"5ed!" относится к системе репутации в CP: если вы посмотрите выше этого, вы найдете строку, которая говорит "Решение 1" - Посмотрите направо, и вы увидите пять звезд. Вот такая "репутация" у этого решения. В этом случае 1 голос "пяти звезд" означает, что Мацей Лос счел это хорошим ответом на ваш вопрос, как было заявлено. 5 стартов-это "голос вверх", который дает положительную репутацию автору, 1 звезда-это "голос вниз", который дает отрицательную репутацию.
Вы можете в значительной степени игнорировать его или участвовать - это зависит от вас.

Если Вы читаете весь файл в массив байтов, вы можете получить к нему доступ как к оперативной памяти, используя индекс массива в качестве "системы адресации". Затем вы можете довольно легко преобразовать байты в любой нужный вам тип данных - и ссылка, которую я вам дал, содержит код, который делает именно это: он работает из буфера, но это довольно тривиально изменить. Взгляните на некоторые методы в загрузке teh, и вы найдете код для преобразования ряда байтов в строки, символы, целые числа, короткие, двойные ... почти все "стандартные типы" покрыты.

Эта партия должна дать вам достаточно, чтобы делать то, что вы хотите, без особых проблем.

Member 14100511

Окей,
Я оставлю код как VB6. Из того, что было сказано, кажется, что Microsoft в своей бесконечной мудрости лишила VB здравого смысла.

Вместо того, чтобы просто делать то, что я хочу, я должен сделать что-то еще, а затем сделать кучу других вещей, чтобы я мог продолжать и делать то, что я хочу делать, а затем сделать еще одну кучу вещей, чтобы произвести мои изменения.
Если на этом сайте есть эквивалент модераторов, пожалуйста, удалите мой вопрос и удалите мое членство.
Спасибо.

OriginalGriff

Нет, они переместили его из довольно дерьмового языка меньшинства в тот, который можно использовать в различных средах (от Windows, до интернета, облака, iPhone и Android), даже если он все еще считается "детскими шагами" языка многими по сравнению с C# или C++.

Да, есть чему поучиться, потому что структура огромна, последовательна и содержит много вещей, которые действительно облегчают вам жизнь, когда вы привыкли думать "современным способом". VB6 в значительной степени умер пятнадцать лет назад, и придерживаться его-очень ретроградный шаг.

Я бы посоветовал вам на время забыть VB и вместо этого изучить C# и .NET (чтобы ваш опыт работы с VB6 не побуждал вас использовать устаревшие конструкции вместо более новых эквивалентов). Сам язык не должен занимать больше недели (черт возьми, опытный разработчик может получить достаточно, чтобы обойтись днем!), но ... NET framework займет хорошее количество времени, там есть огромное количество. Вам книги издательства wrox и Эддисон Уэсли делать какие-то хорошие, и Петцольд бесплатно:
http://www.charlespetzold.com/dotnet/index.html
Хотя фон C++ основан в основном на нем.

Как только вы привыкнете к нему, это сделает жизнь намного проще, а развитие быстрее и надежнее.

Рейтинг:
1

Dave Kreskowiak

Если вам нужно попытаться выполнить преобразование кода "строка за строкой" (я не рекомендую этого делать!), то вы ищете BinaryReader[^] и BinaryWriter[^] учебные занятия. Он позволяет выполнять все виды операций чтения и записи для различных типов (байт, int16, int32, int64, подписанный байт, одиночный, ...)

Однако они не предоставляют никаких функциональных возможностей для поиска вокруг файла. Это достаточно легко сделать, открыв файл с помощью FileStream, который позволит вам искать вокруг. Этот файловый поток затем может быть передан в BinaryReader/Writer, который позволит вам читать/писать именно то, что вы хотите.

Using myFile As FileStream = File.Open(filename, FileMode.Open)
    Using fileContent As New BinaryReader(myFile)
        myFile.Seek(position)
        Dim someValue As Integer = fileContent.ReadInt32();
    End Using
End Using