Как мне прочитать двоичный файл в C #? - PullRequest
2 голосов
/ 05 января 2011

У меня есть файл, который существует в тексте и двоичном изображении, мне нужно прочитать от 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

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

Ответы [ 2 ]

3 голосов
/ 05 января 2011

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

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

Для анализа изображения вам необходимо использоватьпарсер изображений.NET имеет несколько как часть их пространств имен GUI.В приведенном ниже примере я использую один из System.Drawing (формы Windows), но аналогичные существуют в 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(...);

2 голосов
/ 05 января 2011

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

...