2011-07-19 14 views
1

我正在處理包含文本消息的字節數組,但消息中的某些字符是控制字符(即小於0x20)和I想要將它們替換爲解碼爲ASCII時人類可讀的字符序列(例如0x0F將顯示[TAB],而不是實際上是製表符)。所以當我看到它時,我有三種選擇:字節數組替換字節與字節序列效率:迭代和複製與SelectMany

  1. 將整個東西解碼爲ASCII字符串,然後用String.Replace()替換掉我想要的東西。問題在於這些字符似乎只是被解碼爲不可打印的盒子字符或問號,從而失去了它們的實際字節值。
  2. 遍歷字節數組尋找我的任何控制字符並執行數組插入操作(創建新的更大的數組,複製現有數據塊,寫入新數據塊)。
  3. 使用Array.ToList<byte>()將字節數組轉換爲List,然後使用IEnumerable.SelectMany()將控制字符轉換爲可讀字符序列,然後SelectMany將爲我退出。

所以問題是,哪個是效率最好的選擇?對於IEnumerable lambda操作的性能影響,我並沒有很好的感覺。我相信選項1在功能上不可行,但我可能是錯的。

回答

0

嘗試

// your byte array for the message 
byte[] TheMessage = ...; 
// a string representation of your message (the character 0x01... 0x32 are NOT altered) 
string MessageString = Encoding.ASCII.GetString(TheMessage); 
// replace whatever you want... 
MessageString = MessageString.Replace (" ", "x").Replace ("\n", " ")... 
// the replaced message back as byte array 
byte[] TheReplacedMessage= Encoding.ASCII.GetBytes(MessageString.ToCharArray()); 

編輯:

樣品更換一個8位字節值

MessageString = MessageString.Replace (Encoding.ASCII.GetString (new byte[] {0xF7}), " ")... 

關於性能 我不是100%肯定它是否是最快的方法。 ..我們只是嘗試了幾種方法,儘管我們的要求是在原始字節數組中替換「1-n字節的字節數組」......這樣就出現了緊固件+麻醉我們的用例(1 MB - 1 GB文件)。

+0

這是我如上所述的解決方案1。我仍然不相信這將可靠地用於不可打印的ASCII字符,但假設它是,它是最有效的方法嗎?如果是這樣,爲什麼? – Kongress

+0

通過這種方式,ASCII不可打印的字符0x01 - 0x20不會被改變 - 我們使用這種方法並且經常檢查它...文檔指出它至少對於7Bits來說是乾淨的...在我們的經驗中,我們從來沒有遇到過8位的問題字符...我添加了一個示例替換爲8位值... – Yahia