Обычно для чтения символов из потока байтов используется StreamReader. В этом примере я читаю записи, разделенные символом '\r', из бесконечного потока.
using(var reader = new StreamReader(stream, Encoding.UTF8))
{
var messageBuilder = new StringBuilder();
var nextChar = 'x';
while (reader.Peek() >= 0)
{
nextChar = (char)reader.Read()
messageBuilder.Append(nextChar);
if (nextChar == '\r')
{
ProcessBuffer(messageBuilder.ToString());
messageBuilder.Clear();
}
}
}
Проблема в том, что StreamReader имеет небольшой внутренний буфер, поэтому, если код ожидает разделителя «конец записи» ('\r' в данном случае ), он должен ждать, пока внутренний буфер StreamReader не будет очищен (обычно потому, что поступило больше байтов ).
Эта альтернативная реализация работает для однобайтовых символов UTF -8, но не работает с многобайтовыми символами.
int byteAsInt = 0;
var messageBuilder = new StringBuilder();
while ((byteAsInt = stream.ReadByte()) != -1)
{
var nextChar = Encoding.UTF8.GetChars(new[]{(byte) byteAsInt});
Console.Write(nextChar[0]);
messageBuilder.Append(nextChar);
if (nextChar[0] == '\r')
{
ProcessBuffer(messageBuilder.ToString());
messageBuilder.Clear();
}
}
Как я могу изменить этот код, чтобы он работал с многобайтовыми символами -?