用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