Как прочитать двоичный файл на С#?

У меня есть файл, который существует в тексте и двоичном изображении, мне нужно прочитать от 0 до 30 позиции рассматриваемого текста, а позиция 31 будет изображением в двоичном формате. Какие шаги я должен выполнить, чтобы решить эту проблему?

В настоящее время я пытаюсь прочитать его с помощью FileStream, а затем перемещаю переменную FileStream в одну BinaryReader, как показано ниже:

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)
BinaryReader br = new BinaryReader(fs)

Оттуда вперед, я потерян.


ОБНОВЛЕНИЕ

Хорошо, теперь я могу прочитать свой файл. Пока 30-я позиция не будет моей 30-й строкой, с 30-й позиции будет битовая строка, которая на самом деле является изображением. Интересно, как мне прочитать байты с позиции 30, а затем сохранить изображения! У кого-нибудь есть идеи? Следуйте примеру из моего файла, чтобы у вас была идея:

£ˆ‰¢@‰¢@¢–”…@•…¦@„£@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.-///%<<??@[K}@k{M÷]kðñôôô}ù~øòLKóôòÿg

Обратите внимание, что даже @ @ @ — это моя строка, и поэтому картинка будет состоять из одного байта.


person mcamara    schedule 05.01.2011    source источник
comment
Итак, как вы читаете файл в первую очередь?   -  person RvdK    schedule 05.01.2011
comment
Я читаю следующим образом: я использую FileStream, а затем перемещаю переменную FileStream в один BinaryReader, как показано ниже: Пример: FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) BinaryReader br = new BinaryReader (fs) Отныне я потерян.   -  person mcamara    schedule 05.01.2011
comment
Для дальнейшего использования лучше отредактировать исходный вопрос, чтобы добавить дополнительные разъяснения. Вы получаете преимущество гораздо лучшего форматирования, особенно, если вы пытаетесь показать код.   -  person Cody Gray    schedule 05.01.2011


Ответы (2)


Немного расширив ответ Роджера, с некоторым кодом.

Строка всегда закодирована в каком-то формате, и для ее чтения нужно знать эту кодировку (особенно при использовании двоичного считывателя). Во многих случаях это обычный ASCII, и вы можете использовать Encoding.ASCII.GetString для его анализа, если вы получаете неожиданные результаты (странные символы и т. д.), а затем попробуйте другую кодировку.

Чтобы разобрать изображение, вам нужно использовать парсер изображений. .NET имеет несколько пространств имен GUI. В примере ниже я использую файл из System. Drawing (оконные формы), но подобные существуют в WPF, и существует множество сторонних библиотек.

using (var reader = new BinaryReader(File.Open(someFile, FileMode.Open))
{
    // assuming your string is in plain ASCII encoding:
    var myString = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(30));
    // The rest of the bytes is image data, use an image library to process it
    var myImage = System.Drawing.Image.FromStream(reader.BaseStream);
}

Теперь в MSDN есть предупреждение об использовании BaseStream в сочетании с BinaryReader, но я считаю, что в приведенном выше случае вы должны быть в безопасности, поскольку вы не используете поток после изображения. Но следите за проблемами. Если это не удается, вы всегда можете прочитать байты в новый byte[] и создать новый MemoryStream из этих байтов.

ИЗМЕНИТЬ:

В своем комментарии вы указали, что ваша строка имеет вид EBCDIC, что, к сожалению, означает, что вы не можете использовать ни одну из встроенных кодировок. расшифровать его. Быстрый поиск в Google выявил сообщение Джона Скита о классе кодирования EBCDIC .NET, который может чтобы вы начали. По сути, это даст вам ebcdicEncoding.GetString(...);

person Isak Savo    schedule 05.01.2011
comment
Итак, когда я использую myString в качестве формата ниже: System.Text.Encoding.ASCII.GetString(reader.ReadBytes(30)); Процедура возвращает его мне: ????@??@????@???@????@@@@@@@@@ Но в моем файле есть следующий текст: £ˆ‰¢@ ‰¢@¢–”…@•…¦@„£@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - person mcamara; 05.01.2011
comment
Я думаю, что мне нужно получить строку с другой кодировкой! - person mcamara; 05.01.2011
comment
Как узнать, какая кодировка используется? Существует UTF8 и множество кодировок, зависящих от локали. - person CodesInChaos; 05.01.2011
comment
Нет, я использую кодировку EBCDIC! - person mcamara; 05.01.2011
comment
О, EBCDIC .. хорошо :) .. Это означает, что вам придется выполнить преобразование самостоятельно, поскольку в .NET для него нет встроенного кодировщика/декодера. - person Isak Savo; 07.01.2011

Вы можете использовать FileStream для открытия и чтения файла . Если вы читаете первые 30 байтов в буфер, вы можете затем преобразовать его в строку, используя «string Encoding.ASCII.GetString (byte [] буфер, int offset, int length)».

person Roger Perkins    schedule 05.01.2011
comment
Извините, но я хотел бы прочитать первые 30 байт с помощью команды подстроки? - person mcamara; 05.01.2011
comment
Почему? Метод через GetString() работает хорошо. Если вы читаете из BinaryReader в буфер (массив байтов), вы можете использовать этот буфер для извлечения строки, а также данных изображения. - person Martin Hennings; 05.01.2011
comment
@tomcamara: подстрока не читается из файла, она извлекает часть строки. Просто делайте то, что сказал Роджер, и это сработает :-) - person Isak Savo; 05.01.2011
comment
@tomcamara: последний параметр GetString() указывает количество байтов, которые вы хотите прочитать. Если вы хотите прочитать первые 30 байтов, то смещение должно быть 0, а длина должна быть 30. - person Devendra D. Chavan; 05.01.2011