为什么不能用StreamReader复制二进制文件?

用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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值