2013-07-24 125 views
4

任何人都可以告訴我這裏發生了什麼?轉換字節數組 - >字符串 - >字節數組損壞數據

 byte[] stamp = new byte[]{0,0,0,0,0,1,177,115}; 
     string serialize = System.Text.Encoding.UTF8.GetString(stamp); 
     byte[] deserialize = System.Text.Encoding.UTF8.GetBytes(serialize); 

     //deserialize == byte[]{0,0,0,0,0,1,239,191,189,115} 

爲什麼是stamp!=反序列化?

+1

你確定他們還不是**相同的字符串**嗎?編碼不需要保存原始字節... –

+0

它們可能是相同的字符串,但我正在使用SQL時間戳,所以我關心字節,而不是字符串... –

回答

5

在你的原始字節數組中,你有177字符,它是plusminus的符號。但是,在序列化過程中,該代碼無法識別。它正在替換爲239 191 189這是替換字符。

以下是供參考的圖表。 http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&utf8=dec

我不太清楚爲什麼plusminus符號不被識別,但這就是爲什麼字節數組不相等。除了交換之外,它們會相同,並且數據不會以任何方式損壞。

+0

啊......有道理......謝謝! –

+1

好問題,它讓我思考並閱讀它。這是一個有趣的問題! –

4

字節數組不能編碼UTF-8中的有效文本字符串,所以當您「序列化」它時,無法識別的部分將被替換爲「替換字符」。如果你必須將字節數組轉換爲字符串,你應該找到一個沒有像這樣的限制的編碼,比如ISO-8859-1。

特別是,字節177不能以有效的UTF-8單獨出現:範圍128-191中的字節是僅在範圍194-244中的字節出現之後纔出現的「連續字節」。你可以在這裏瞭解更多關於UTF-8的信息:https://en.wikipedia.org/wiki/UTF-8

+0

這個表是什麼意思http://www.utf8-chartable.de/unicode-utf8-table.pl?start=128&utf8=dec? –

+1

它似乎是從U + 0080到U + 017F的Unicode字符表,以及它們如何以UTF-8編碼以及它們的含義。例如,U + 00F8被稱爲拉丁小寫字母O WITH STROKE,在UTF-8中它被編碼爲(195,184),這就是它的樣子:ø – Joni

+0

完美,謝謝! –

相關問題