2011-06-10 39 views
0

我正在写一个用于对byte[]缓冲区进行处理的类。它包含如char Peek()string ReadRestOfLine()的方法。c-sharp上的byte []缓冲区处理

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

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

更新

是,这个类是类似于StreamReader了一点,但不同之处在于它会避免创建对象(如stringchar[])等,直到整个期望字符串已被发现。它用于高性能套接字框架。

例如:假设我想写一个代理,它只会检查HTTP请求中的URI。如果我在哪里使用StreamReader,我将不得不在每次完成新接收时创建一个临时字符数组,以查看是否收到了新的行字符。

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

对于大多数协议,在头部区域使用ASCII和UTF8不会是一个问题(请求正文可以使用StreamReader进行分析)。我只关心如何避免创建不必要的对象。

+4

你为什么直接使用这种字符串而不是'Encoding'类? – Oded 2011-06-10 13:29:18

+0

为什么不使用'MemoryStream'类作为你的基础类型?你为什么不把它转换成'string'? – 2011-06-10 13:30:10

回答

0

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

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

1

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

您的课程听起来有点像StreamReaderMemoryStream。也许你可以使用这些?

从文档:

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

如果您的练习的要点是要弄清楚如何自己做这件事... ...了解一下图书馆是如何做到这一点的。我认为你会发现有趣的方法StreamReader.Read()

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

+0

和DetectEncoding() – Magnus 2011-06-10 13:40:45

1

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

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

您可以使用System.Text.Encoding类。您可以使用预定义的编码对象Encoding.UnicodeEncoding.UTF8,并使用类似GetCharCount,GetCharsGetString的方法。