我正在编写一个用于对抗byte[]
缓冲区的类。它包含char Peek()
和string ReadRestOfLine()
等方法。
问题是我想添加对unicode的支持,我真的不知道应该如何更改这些方法(它们现在只支持ASCII)。
如何检测缓冲区中的下一个字节是unicode序列(utf8还是utf16)?如何将它们转换为char
?
更新
是的,该类与StreamReader
有点类似,但区别在于它将避免创建对象(如string
,char[]
)等,直到整个想要的字符串具有被发现了。它用于高性能套接字框架。
例如:假设我想编写一个仅检查HTTP请求中的URI的代理。如果我在哪里使用StreamReader
,每次完成新的接收时我都必须构建一个临时字符数组,以查看是否已收到新的行字符。
通过使用直接对byte[]
使用的socket.ReceiveAsync
缓冲区起作用的类,我只需遍历解析器中的缓冲区以了解下一步是否可以完成。没有创建临时对象。
对于大多数协议,标头区域使用ASCII,UTF8不会出现问题(可以使用StreamReader
解析请求体)。我只是对如何解决避免创建不必要的对象感兴趣。
答案 0 :(得分:1)
我认为你不想去那里。有很多东西可能出错。首先:你使用什么编码?那么,缓冲区是否包含整个编码字符串?或者它是从某个随机位置开始的,可能在这样的序列中?
对于MemoryStream
,您的课程听起来有点像StreamReader
。也许你可以使用那些?
来自文档:
实现一个TextReader,它从特定编码的字节流中读取字符。
如果您的练习要点是弄清楚如何自己动手......看看图书馆是如何做到的。我想你会发现方法StreamReader.Read()
很有趣:
从输入流中读取下一个字符,并将字符位置前移一个字符。
答案 1 :(得分:1)
字节和ASCII字符之间存在一对一的对应关系,因此可以轻松将字节视为字符。修改代码以处理UNICODE的各种编码可能并不容易。但是,要回答部分问题:
如何检测缓冲区中的下一个字节是unicode序列(utf8还是utf16)?如何将它们转换为
char
?
您可以使用System.Text.Encoding
课程。您可以使用预定义的编码对象Encoding.Unicode
和Encoding.UTF8
,并使用GetCharCount
,GetChars
和GetString
等方法。
答案 2 :(得分:0)
我创建了一个BufferSlice
类,它包装了byte []缓冲区,并确保只使用指定的切片。我还创建了一个自定义阅读器来解析缓冲区。
UTF原来不是问题,因为我只解析缓冲区以查找不是多字节的字符(空格,减号,分号等)。然后我使用最后一个分隔符的Encoding.GetString
到当前来获取正确的字符串。