Csharp/C#教程:Stream.Write 与 StreamWriter.Write 的不同分享

一、测试方法是否结果相同
首先看下面两段代码1是StreamWriter.Write2是Stream.Write:

1
代码如下:
Streamms=newMemoryStream();
stringstr=”这是测试字符串”;
StreamWritersw=newStreamWriter(ms,Encoding.UTF8);
sw.Write(str);
sw.Flush();

2
代码如下:
Streamms=newMemoryStream();
stringstr=”这是测试字符串”;
byte[]buffer=Encoding.UTF8.GetBytes(str); 
ms.Write(buffer,0,buffer.Length);
ms.Flush();

上面我们可以看到StreamWriter.Write的可读性更好一些。

但是这两段代码执行后的ms是否是相同的结果呢?

首先我们来看下长度吧,在代码最后分别加上

代码如下:
Console.WriteLine(“StreamWriter.Write:{0}”,ms.Length);
Console.WriteLine(“Stream.Write:{0}”,ms.Length);

执行后结果如下:

Stream.Write 与 StreamWriter.Write 的不同

各位看官,看到这里有何想法?

二、深究原因
下面继续深究一下这个多出来的3个字节

在方法后面都加上如下一段代码将MemoryStream的内容以十六进制的形式打印出来

代码如下:
ms.Position=0;
byte[]bytes=newbyte[ms.Length];
ms.Read(bytes,0,bytes.Length);
foreach(variteminbytes){
Console.Write(item.ToString(“X2″)+””);
}
Console.WriteLine(String.Empty);

再次执行结果如下:

 

Stream.Write 与 StreamWriter.Write 的不同

这里我们发现用StreamWriter.Write输出多出了EFBBBF这3个字节

Google一下:多出来的这个玩意是字节顺序记号(英语:byte-ordermark,BOM)

在维基百科中可以查到:

编码 表示(十六进制) 表示(十进制) UTF-8 EFBBBF 239187191 UTF-16(大端序) FEFF 254255 UTF-16(小端序) FFFE 255254 UTF-32(大端序) 0000FEFF 00254255 UTF-32(小端序) FFFE0000 25525400 UTF-7 2B2F76和以下的一个字节:[38|39|2B|2F] 4347118和以下的一个字节:[56|57|43|47] en:UTF-1 F7644C 24710076 en:UTF-EBCDIC DD736673 221115102115 en:StandardCompressionSchemeforUnicode 0EFEFF 14254255 en:BOCU-1 FBEE28 及可能跟随着FF 25123840 及可能跟随着255

ok,了解了这个东西后我们就就需要知道在StreamWriter.Write中能否用代码控制不输出这个BOM吗?

三、查找解决办法
开始反编译StreamWriter.Write这个方法:
Stream.Write 与 StreamWriter.Write 的不同

大致猜测是红色方框的代码输出了BOM信息,ok再进去看:

 

Stream.Write 与 StreamWriter.Write 的不同

果然在这里,看上图红框处,GetPreamble方法是获取编码的字节序列,和我们之前查到的信息完全一致。

好下面继续找这个haveWrittenPreamble有没设置的可能,在Init方法中找到了它的身影。

 

Stream.Write 与 StreamWriter.Write 的不同

杯具了,CanSeed没有set方法,Write之前的Position肯定为0,至此结束。

四、结论
由上面的结论,我们可以确定:

1.如果双方协议无BOM时,可以使用Stream.Write方法来输出,或者使用StreamWriter.Write时加入newUTF8Encoding(false)参数。

2.有BOM时,我们可以通过GetPreamble和Stream.Write来完成StreamWriter.Write的功能。

标签: tr ite te

C#中 const 和 readonly 的不同

C++智能指针实例详解

上述就是C#学习教程:Stream.Write 与 StreamWriter.Write 的不同分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/904580.html

(0)
上一篇 2021年10月21日
下一篇 2021年10月21日

精彩推荐