User 13886544 Ответов: 1

Как открыть файл любого типа в visual basic, преобразовать его в двоичный файл и отобразить этот двоичный файл на экране?


Мне нужно открыть любой файл типа и преобразовать его в двоичный файл, а затем отобразить этот двоичный файл либо в текстовом поле, либо в списке. Я знаю о imports IO и openDialogBox, и я видел, как кто-то использовал текстовое поле для ввода текста, а затем отображал его двоичный файл. Как бы я этого добился?

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

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

Richard Deeming

Звучит так, будто ты ищешь ... ByteViewer[^] контроль.

1 Ответов

Рейтинг:
0

Dave Kreskowiak

Ваш вопрос показывает тонну наивности.

Все файлы уже являются "двоичными". Так что вам придется объяснить, что вы имеете в виду. Вы хотите показать содержимое в формате шестнадцатеричного редактора, со смещением и значением байта в этом смещении вместе с текстовым представлением этого байта?

Файлы .BIN-это просто данные, скорее всего, никогда не текст, поэтому показ содержимого в текстовом поле не покажет ничего, кроме того, что кажется случайным мусором.


Dave Kreskowiak

Да, вы не прояснили ни малейшей наивности. Нет такого понятия, как "преобразовано обратно при открытии". Они остаются "двоичными", то есть просто потоком байтов. Способ чтения файла будет либо в "двоичном" режиме, либо в виде потока байтов, либо в виде текстового потока, где поток байтов интерпретируется как текст в зависимости от используемой кодировки. Текст может содержать несколько байтов на символ.

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

Файл .bin не имеет никакого значения или формата. Это просто поток байтов. Вы можете выбрать любой файл, который вы хотите, и просто изменить расширение файла, и это точно такой же файл. Я понятия не имею, о чем вы говорите, когда говорите "выберите Файл и конвертируйте его в файл .bin". Этот файл имеет значение только для скрипта, который его создал, и только тот же самый скрипт или что-то еще, настроенное для открытия файлов .bin по умолчанию на вашем компьютере, имеет какое-либо представление о том, как преобразовать этот файл обратно.

Это звучит так, как будто тот сценарий, который у вас есть, может быть утилитой сжатия, которая сжимает файлы в более мелкие архивы. Когда он "конвертируется обратно", утилита распаковывает файл обратно к его исходному содержимому, так что приложение, назначенное для чтения этого типа файла, затем может прочитать его снова.

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

Если вы говорите о том, как приложение читает и отображает содержимое файла на экране, то то, о чем вы говорите, невозможно. Только приложение, которое читает эти типы файлов, сможет понять смысл файла, интерпретировать содержимое и правильно отобразить его на экране.

Вы можете написать свои собственные интерпретаторы и код рендеринга, чтобы сделать это, но вам придется писать эти вещи для каждого типа файлов, которые вы хотите поддерживать. Нет такой вещи, как написать это один раз, и это работает для каждого типа файлов! Это просто невозможно.


Dave Kreskowiak

Вы зря тратите свое драгоценное время. Вы, кажется, не понимаете, что файлы редко бывают текстовыми и читаемыми человеком.

Не каждый байт файла представляет собой текстовый символ. Существует 256 возможных байтовых значений, только часть из которых представляет печатаемые символы.

Dave Kreskowiak

Эй, я попытался получить более конкретное описание того, что вы пытаетесь сделать из вас, и указал, что ваше описание того, как работают файлы, вообще не было точным, и улучшил ваше понимание.

Пока что мое лучшее предположение остается в силе. Вы пытаетесь написать что-то вроде шестнадцатеричного редактора, который показывает содержимое файла байт за байтом, но вы ничего об этом не сказали.

Ричард опубликовал комментарий, который делает то же самое предположение, и вы не сказали
что-нибудь об этом.

Если вы не можете описать, что вы хотите сделать с группой людей, как вы собираетесь описать, как сделать это с компьютером, который гораздо более разборчив?

Dave Kreskowiak

Я хотел бы прочитать двоичный файл файла и отобразить двоичные файлы, такие как 0 и 1, в списке или текстовом поле.
Наконец, конкретная спецификация, с которой мы можем работать!

BinaryReader будет возвращать байты, а не массив из 0 и 1. Технически, вам это даже не нужно, потому что есть ярлык, файл.ReadAllBytes(). Используйте ярлык, и вы получите обратно массив байтов.

Теперь для каждого байта вы должны построить строку из 0 и 1 самостоятельно. Для этого вы используете объект StringBuilder. Вы также должны пройти через каждый байт и определить, включен ли каждый бит или выключен. Это требует немного маскировки и оператора And.

Вам понадобится цикл, чтобы пройти через каждый байт в файле, и еще один внутренний цикл, чтобы пройти через все 8 бит в каждом байте. Если замаскированный бит возвращается на 0, скажите StringBuild добавить "0", в противном случае добавьте "1".

Осторожный. Текстовое поле действительно не было предназначено для отображения мегабайт текста. Если вы откроете файл размером 1 МБ, чтобы сгенерировать эту строку из 1 и 0, то получите строку длиной 8 МБ.

Dave Kreskowiak

Расширение файла не определяет, каков его формат. Приложение, записывающее файл и считывающее его обратно, - это то, что определяет формат, и оно имеет полный полный контроль над тем, что оно пишет и как. Это то, что делает формат.

Расширение файла в файле подобно номерному знаку на автомобиле. Смена номерного знака ничего не меняет в машине, не так ли? То же самое верно и для расширений файлов.

Вы можете дать своему файлу любое расширение, которое захотите. Это не имеет значения.

Пример того, как записать данные с помощью BinaryWriter и прочитать их обратно с помощью BinaryReader, см. В разделе Класс BinaryWriter (System.IO) | Microsoft Docs[^]

Dave Kreskowiak

Опять же, нет. Вы придумываете формат файла, просто записывая данные самостоятельно.

Не существует такого понятия, как "формат файла", который определяется чем-либо, кроме того, как приложение записывает свои данные.

Dave Kreskowiak

А так ты не можешь. По крайней мере, не так, как ты думаешь. У вас нет целого числа или чего-то близкого к нему. У вас есть большая строка, состоящая из числовых символов.

На самом деле вы не можете просто разделить строку на кучу кусков, которые поместятся в целое число. Преобразование целых чисел обратно будет означать, что вы также должны учитывать ведущие нули, чтобы положить их обратно в строку.

Вы можете использовать поток GZip (сжатие), но это становится немного сложнее. Например, см. Строка сжатия/декомпрессии с переполнением стека C#[^]

Richard MacCutchan

Пока вы терпеливо ждете, позвольте мне заметить, что все, что написал Дэйв, абсолютно верно. Любой файл, каким бы он ни был создан, состоит из потока байтов. Интерпретация этих байтов в "правильные" данные может быть выполнена только программой, которая их написала, или кем-то, кто знает точный формат файла. Например у меня есть файл данных для личного использования первые 10 байт которого могут выглядеть следующим образом:

54 57 01 00 00 0C 16 00 00 00

The first two bytes represent a short word that identifies the file type, and its version. The next four bytes represent an integer with a control value in the top 8 bits, and a value of 1 in the low order 24 bits - it identifies the next field and its length.. The next four represent a word with a value of 22, which tells me how many records follow. I will refrain from trying to explain the format of each record, which contains encrypted text. All of these values are used by my program to create a list of records that I can display on screen in a ListView control. If you wrote a program to read that file you would have no idea how to interpret those values.

Dave Kreskowiak

Чувак. Да что с тобой такое?

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

Да, вы наивны. Вы определенно "показываете недостаток опыта, мудрости или суждения", когда дело доходит до этого. Почему? Потому что вы не знаете этого материала, о чем свидетельствует тот факт, что вы находитесь в классе для VB.NET! Ваша очевидная проблема заключается в том, что вы, кажется, не в состоянии признать, что "вы не знаете".

Я пытаюсь понять, что вы на самом деле делаете, используя самые расплывчатые термины и неточности.

Я пытаюсь рассказать вам, как на самом деле работают файлы и как на самом деле нет такой вещи, как "формат файла", без приложения, которое знает, что означает каждый байт в каждой позиции файла.

Я пытаюсь сказать вам, что способ, которым вы, по-видимому, требуете что-то сделать, не является лучшим или самым простым способом сделать это, и что есть лучшая, более гибкая альтернатива.

..- и что же вы делаете? Обвините меня в том, что я не "помогаю" вам!

Извините, но длина этой нити сама по себе свидетельствует об обратном.

Развлекайтесь с остальными учениками вашего класса.

Dave Kreskowiak

Во-первых, 10^308-это огромное число и намного больше, чем 8 байт. Нет никакого способа, которым вы храните 308 чего-либо в 8 байтах. Ваши 308 "бит" поместятся примерно в 39 байт, в зависимости от формата хранения.

Во-вторых, у вас уже есть эта строка, хранящаяся в "сжатом" формате. Это исходный файл, из которого вы создали "двоичную строку".

Счастливой вам жизни.

Richard MacCutchan

10^308-это не 308 цифр (что-то еще, чего вы не понимаете). Он равен 10 в степени 308 и обычно хранится в виде значения с плавающей запятой двойной длины в 8 байтах. Вам действительно нужно раздобыть приличную книгу, которая научит вас основам компьютерной архитектуры, потому что здесь нет места для предоставления полных объяснений, о которых вам нужно узнать.

[no name]

Извините, 10 в степени 308-это 1, за которым следуют 308 нулей(цифр) длиной, а двойник в visual basic может использовать все эти цифры без десятичной точки и хранить в 8 байтах. Да, больше нет необходимости комментировать. Неужели тебе просто нравится указывать на каждую мою ошибку? Давай просто покончим с этим здесь, как взрослые мужчины.

Nelek

Вы можете предоставить скриншоты... просто сделайте их, используйте хост-сервис в интернете, например imgurg, и скопируйте сюда ссылку. Тогда вы сможете доказать, насколько неправы специалисты, к которым вы обращаетесь за помощью.