2009-07-01 54 views
1

我有一個過程,試圖從二進制流中解碼不同的字符串編碼。當我通過它時,我會收到一些行爲,這些行爲在我的腦海裏並不那麼完美。具體地講,我做的是:.NET流解碼器行爲

  • 獲得其中將用於一個字符在給定的編碼
  • 搶字節的量從流
  • 使用Encoding.GetCharCount編碼字節,以確定只是的最大數目多少個字符可能會在這些字節被編碼(可能是0一兩個...)
  • 如果不爲零,我使用Encoding.GetString抓住人物出來的字節數組的
  • 我然後找出多少字節被用來編碼提取的cha如果可解碼的字節數爲零,則將索引提前一個字節,然後再次嘗試整個事物...以這種方式,我希望不會錯過任何可解碼的字符

順便說一句,如果有人注意到在上述的任何不正確的假設,隨便這麼說...

我有我的解碼器設置扔DedcoderFallbackExceptions時,他們無法解碼一組給定的字節。令我困惑的是,有些時候,我打電話給GetCharCount的時候會出現異常,有時我會打電話給GetString。這有什麼理由應該發生?這是否事實上是預期的?我希望能夠在儘可能少的地方可靠地檢查可打印字符的存在 - 目前我正在幾個地方進行打印。

有什麼想法?

感謝, 布賴恩

大更新: 似乎缺少了一下我的問題的初步描述。讓我多了一些房屋增加的問題:

  • 流可能是非常大 - 它不會適合在內存對於大多數用戶
  • 在任何給定的位置流我不知道我是在文本的開始處,在文本中間
  • 在流中的任何給定位置我不知道我是否處於多字節字符的中間或開始處
  • 流將包含很多材料其實不是任何形式的文字,以及不同的編碼一知半解

希望這澄清了一些問題。迄今爲止的迴應非常有幫助!請繼續!

+0

我真的不明白,爲什麼你要做到這一點。如果可能的話,最有效的方法是將整個事物讀入內存並一次處理。 – 2009-07-01 23:18:53

回答

3

像UTF8這樣的編碼對字符使用可變數量的字節,因此您不能簡單地乘以從流中獲取的最大字節數。最後一個字節可能會落在字符的中間(並且可能無效),或者最後一個字符可能表示該特定編碼上的完全不同的字符。

+0

優秀的一點 - 我想我已經解決了這個問題,雖然我沒有在我原來的帖子中提到過任何...我會詳細說明。 – 2009-07-01 23:10:50

+0

嗯現在我想起它,似乎有可能我錯誤地解碼看起來像文本的材料,但實際上只是巧合,在這一點上我會在一個不正確的偏移,對嗎?有沒有辦法解決? – 2009-07-01 23:15:47

+1

也許吧。它可能發生取決於編碼。爲了安全地做到這一點,你應該爲它們加上字節數和編碼。如果這些字節看起來像另一種編碼中的有效文本,並且您首先嚐試了該文本? – 2009-07-01 23:22:03

1

哇。聽起來像是強大的矯枉過正。你有沒有嘗試過使用你的編碼的GetDecoder方法?它用一個GetChars方法給你一個解碼器,它將一個字節數組和一個字符數組提供給它,並使用從字節數組解碼的可用字符填充字符數組。

如果有任何過沖(即備用字節),它們將保存在解碼器的狀態中,以便下次以新鮮字節調用GetChars時。

您可以使用StringBuilder來組裝結果。

比你的方法簡單一點。