Как лучше всего читать смешанные (т.е. текстовые и двоичные) данные? - PullRequest
2 голосов
/ 02 февраля 2009

Мне нужно иметь возможность читать формат файла, который смешивает двоичные и недвоичные данные. Предполагая, что я знаю, что вход хороший, каков наилучший способ сделать это? В качестве примера, давайте возьмем файл с двойной строкой в ​​качестве первой строки, новой строкой (0x0D 0x0A) и затем десятью байтами двоичных данных впоследствии. Я мог бы, конечно, вычислить позицию новой строки, затем создать BinaryReader и искать эту позицию, но я продолжаю думать, что должен быть лучший путь.

Ответы [ 3 ]

3 голосов
/ 02 февраля 2009

Вы можете использовать System.IO.BinaryReader. Однако проблема в том, что вы должны знать, какой тип данных вы собираетесь читать, прежде чем вызывать любой из методов Read.

Read(byte[], int, int)
Read(char[], int, int)
Read()
Read7BitEncodedInt()
ReadBoolean()
ReadByte()
ReadBytes(int)
ReadChar()
ReadChars()
ReadDecimal()
ReadDouble()
ReadInt16()
ReadInt32()
ReadInt64()
ReadSByte()
ReadSingle()
ReadString()
ReadUInt16()
ReadUInt32()
ReadUInt64()

И, конечно, для записи в System.IO.BinaryWriter существуют те же методы.

2 голосов
/ 02 февраля 2009

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

В противном случае вам нужно будет прочитать куски из файла, выполнить поиск новой строки и декодировать нужный объем данных или (если вы не нашли новую строку) либо буферизовать его где-нибудь еще (например, MemoryStream) или просто запомните начальную точку и перемотайте поток соответствующим образом. Это будет ужасно, но это только из-за недостатка формата файла.

Я бы посоветовал вам не"пере-декодировать" (т.е. декодировать произвольные двоичные данные после строки) - хотя это вполне может не причинить вреда, в некоторых кодировках вы могли бы читать невозможная последовательность двоичных данных, которая затем начинает попадать в области DecoderFallbacks и т. п.

1 голос
/ 02 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...