Обработка буфера byte [] на c-sharp - PullRequest
0 голосов
/ 10 июня 2011

Я пишу класс, который используется для работы с буфером byte[].Он содержит такие методы, как char Peek() и string ReadRestOfLine().

. Проблема в том, что я хотел бы добавить поддержку юникода, и я действительно не знаю, как мне изменить эти методы (они теперь поддерживают только ASCII).

Как определить, что следующие байты в буфере являются последовательностью Unicode (utf8 или utf16)?И как мне преобразовать их в char?

Обновление

Да, класс немного похож на StreamReader, но с той разницей, чтоон будет избегать создания объектов (например, string, char[]) и т. д., пока не будет найдена вся искомая строка.Он используется в высокопроизводительной среде сокетов.

Например: допустим, я хочу написать прокси, который будет проверять только URI в HTTP-запросе.Если бы я использовал StreamReader, мне пришлось бы создавать массив временных символов каждый раз, когда новый прием завершался, просто чтобы увидеть, был ли получен символ новой строки.

Используя класс, который работает непосредственно с буфером byte[], который использует socket.ReceiveAsync, мне просто нужно пройти через буфер в моем анализаторе, чтобы узнать, можно ли завершить следующий шаг.Временные объекты не создаются.

Для большинства протоколов ASCII используется в области заголовка, и UTF8 не будет проблемой (тело запроса может быть проанализировано с использованием StreamReader).Мне просто интересно, как это можно решить, избегая создания ненужных объектов.

Ответы [ 3 ]

1 голос
/ 10 июня 2011

Между байтами и символами ASCII существует взаимно-однозначное соответствие, что упрощает обработку байтов как символов.Изменение вашего кода для обработки различных кодировок UNICODE может быть нелегким.Однако, чтобы ответить на часть вашего вопроса:

Как мне определить, что следующие байты в буфере являются последовательностью Unicode (utf8 или utf16)?И как мне преобразовать их в char?

. Вы можете использовать класс System.Text.Encoding.Вы можете использовать предопределенные объекты кодирования Encoding.Unicode и Encoding.UTF8 и использовать такие методы, как GetCharCount, GetChars и GetString.

1 голос
/ 10 июня 2011

Не думаю, что ты хочешь туда пойти. Есть множество вещей, которые могут пойти не так. Прежде всего: какую кодировку вы используете? Тогда в буфере содержится вся закодированная строка? Или он начинается в некоторой случайной позиции, возможно, внутри такой последовательности?

Ваши классы звучат немного как StreamReader для MemoryStream. Может быть, вы можете использовать их?

Из документации:

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

Если цель вашего упражнения - выяснить, как сделать это самостоятельно ... взгляните на то, как это сделала библиотека. Я думаю, вы найдете метод StreamReader.Read() интересным:

Считывает следующий символ из входного потока и увеличивает позицию символа на один символ.

0 голосов
/ 01 июля 2011

Я создал класс BufferSlice, который оборачивает буфер byte [] и гарантирует, что используется только назначенный фрагмент. Я также создал специальный ридер для разбора буфера.

UTF оказался не проблемой, так как я только анализирую буфер, чтобы найти символы, которые не являются многобайтовыми (пробел, минус, точка с запятой и т. Д.). Затем я использую Encoding.GetString от последнего разделителя до текущего, чтобы получить правильную строку обратно.

...