2011-06-10 101 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的方法。