用StreamReader.ReadToEnd()讀取一個mp3文件,得到一個string,再把這個string寫回到一個文件,結果mp3不能放了。即使把這個String再次編碼回byte[],用FileStream寫進文件也不能放,為什麼?
過程中新舊的文件大小並沒有改變,不能播放的原因是文件數據失真,不是原本的數據。
StreamReader是專門設計方便讀取字符串的,它實際上是一個Stream跟Encoding的結合體。例如內部用FileStream讀取一個byte[],然後把它編碼成string。
其實數據被破壞,原因在於byte[]到string的轉換過程,即Encoding過程。測試代碼如下:
從輸出的結果可以看出,大於127的數據,都被編碼成63了,即字符''?'',所以大於127的數據都失真了。
測試unicode後,得出類似的結果。這些編碼的碼表並非都是一對一對應,有部分位置並沒有對應的編碼,而是統統弄個固定數值來對應,例如''?'',不是一對一編碼,當然數據失真了。
技術討論的QQ群: 2514097 或 10987609