2011-01-05 1 views
2

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

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

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

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


UPDATE

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

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

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

+0

Итак, как вы читаете файл в первую очередь? – RvdK

+0

Читаю следующим образом: Я использую FileStream и потом я перехожу FileStream вар к одному BinaryReader, как показано ниже: Ex: FileStream фс = новый FileStream (Filepath, FileMode.Open, FileAccess.Read)) BinaryReader br = new BinaryReader (fs) Отныне я теряюсь. – mcamara

+1

Для дальнейшего использования лучше отредактировать исходный вопрос, чтобы добавить дополнительные разъяснения. Вы получаете гораздо лучшее форматирование, особенно если вы пытаетесь показать код. –

ответ

3

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

Строка всегда кодируется в некотором формате, и для ее чтения вам необходимо знать эту кодировку (особенно при использовании двоичного считывателя). Во многих случаях это простой 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 имеет caution about с использованием BaseStream в сочетании с BinaryReader, но я считаю, в приведенном выше случае, вы должны быть безопасными, так как вы не используете поток после изображения. Но следите за проблемами. Если не удается, вы всегда можете прочитать байты в новом byte[] и создать новый MemoryStream из этих байтов.

EDIT:

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

+0

Итак, когда я использую myString как формат ниже: System.Text.Encoding.ASCII.GetString (reader.ReadBytes (30)); Процедура возвращает его мне: ???? @ ?? @ ???? @ ??? @ @ @ @@@@@@@@ Но у моего файла есть следующий текст: £ ‰ ¢ @ ‰ ¢ @ ¢ - "... @ • ... | @" £ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ – mcamara

+0

Я думаю, что мне нужно получить строку с другой кодировкой! – mcamara

+0

Как узнать, какая кодировка используется? Существует UTF8 и множество языковых зависимостей. – CodesInChaos

2

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

+0

Извините, но я бы хотел прочитать первые 30 байт с помощью команды подстроки? – mcamara

+0

Почему? Метод через GetString() работает хорошо. Если вы прочитали из BinaryReader в буфер (массив байтов), вы можете использовать этот буфер для извлечения строки, а также данных изображения. –

+0

@tomcamara: подстрока не читается из файла, она извлекает фрагмент строки. Просто сделайте то, что сказал Роджер, и он будет работать :-) –