c-sharp上的byte []缓冲区处理

时间:2011-06-10 13:27:49

标签: c# unicode bytearray

我正在编写一个用于对抗byte[]缓冲区的类。它包含char Peek()string ReadRestOfLine()等方法。

问题是我想添加对unicode的支持,我真的不知道应该如何更改这些方法(它们现在只支持ASCII)。

如何检测缓冲区中的下一个字节是unicode序列(utf8还是utf16)?如何将它们转换为char

更新

是的,该类与StreamReader有点类似,但区别在于它将避免创建对象(如stringchar[])等,直到整个想要的字符串具有被发现了。它用于高性能套接字框架。

例如:假设我想编写一个仅检查HTTP请求中的URI的代理。如果我在哪里使用StreamReader,每次完成新的接收时我都必须构建一个临时字符数组,以查看是否已收到新的行字符。

通过使用直接对byte[]使用的socket.ReceiveAsync缓冲区起作用的类,我只需遍历解析器中的缓冲区以了解下一步是否可以完成。没有创建临时对象。

对于大多数协议,标头区域使用ASCII,UTF8不会出现问题(可以使用StreamReader解析请求体)。我只是对如何解决避免创建不必要的对象感兴趣。

3 个答案:

答案 0 :(得分:1)

我认为你不想去那里。有很多东西可能出错。首先:你使用什么编码?那么,缓冲区是否包含整个编码字符串?或者它是从某个随机位置开始的,可能在这样的序列中?

对于MemoryStream,您的课程听起来有点像StreamReader。也许你可以使用那些?

来自文档:

  

实现一个TextReader,它从特定编码的字节流中读取字符。

如果您的练习要点是弄清楚如何自己动手......看看图书馆是如何做到的。我想你会发现方法StreamReader.Read()很有趣:

  

从输入流中读取下一个字符,并将字符位置前移一个字符。

答案 1 :(得分:1)

字节和ASCII字符之间存在一对一的对应关系,因此可以轻松将字节视为字符。修改代码以处理UNICODE的各种编码可能并不容易。但是,要回答部分问题:

  

如何检测缓冲区中的下一个字节是unicode序列(utf8还是utf16)?如何将它们转换为char

您可以使用System.Text.Encoding课程。您可以使用预定义的编码对象Encoding.UnicodeEncoding.UTF8,并使用GetCharCountGetCharsGetString等方法。

答案 2 :(得分:0)

我创建了一个BufferSlice类,它包装了byte []缓冲区,并确保只使用指定的切片。我还创建了一个自定义阅读器来解析缓冲区。

UTF原来不是问题,因为我只解析缓冲区以查找不是多字节的字符(空格,减号,分号等)。然后我使用最后一个分隔符的Encoding.GetString到当前来获取正确的字符串。