程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 為什麼不能用StreamReader復制二進制文件?

為什麼不能用StreamReader復制二進制文件?

編輯:.NET實例教程


用StreamReader.ReadToEnd()讀取一個mp3文件,得到一個string,再把這個string寫回到一個文件,結果mp3不能放了。即使把這個String再次編碼回byte[],用FileStream寫進文件也不能放,為什麼?

過程中新舊的文件大小並沒有改變,不能播放的原因是文件數據失真,不是原本的數據。

StreamReader是專門設計方便讀取字符串的,它實際上是一個Stream跟Encoding的結合體。例如內部用FileStream讀取一個byte[],然後把它編碼成string。

其實數據被破壞,原因在於byte[]到string的轉換過程,即Encoding過程。測試代碼如下:



byte[] buf = new byte[256];
for (int i = 0; i < buf.Length; i++)
    buf[i] = (byte)i;
string result = Encoding.ASCII.GetString(buf);
foreach (char c in result)
    Console.WriteLine("{0}:{1}", c, (int)c);

從輸出的結果可以看出,大於127的數據,都被編碼成63了,即字符''?'',所以大於127的數據都失真了。

測試unicode後,得出類似的結果。這些編碼的碼表並非都是一對一對應,有部分位置並沒有對應的編碼,而是統統弄個固定數值來對應,例如''?'',不是一對一編碼,當然數據失真了。

技術討論的QQ群: 2514097 或 10987609 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved