最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Stream.Write 與 StreamWriter.Write 的不同

 更新時(shí)間:2013年04月24日 14:55:16   作者:  
Stream.Write 與 StreamWriter.Write 是我們?cè)谙蛄髦袑憯?shù)據(jù)時(shí),最常用的方法。下面就詳細(xì)講解這兩個(gè)方法。

一、測(cè)試方法是否結(jié)果相同
首先看下面兩段代碼1是StreamWriter.Write 2是Stream.Write:


1

復(fù)制代碼 代碼如下:

Stream ms = new MemoryStream();
string str = "這是測(cè)試字符串";
StreamWriter sw = new StreamWriter(ms, Encoding.UTF8);
sw.Write(str);
sw.Flush();

2

復(fù)制代碼 代碼如下:

Stream ms = new MemoryStream();
string str = "這是測(cè)試字符串";
byte[] buffer = Encoding.UTF8.GetBytes(str); 
ms.Write(buffer, 0, buffer.Length);
ms.Flush();

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

但是這兩段代碼執(zhí)行后的ms是否是相同的結(jié)果呢?

首先我們來看下長(zhǎng)度吧,在代碼最后分別加上

復(fù)制代碼 代碼如下:

Console.WriteLine("StreamWriter.Write:{0}", ms.Length);
Console.WriteLine("Stream.Write:{0}", ms.Length);

執(zhí)行后結(jié)果如下:

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

二、深究原因
下面繼續(xù)深究一下這個(gè)多出來的3個(gè)字節(jié)

在方法后面都加上如下一段代碼將MemoryStream的內(nèi)容以十六進(jìn)制的形式打印出來

復(fù)制代碼 代碼如下:

ms.Position = 0;
byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
foreach (var item in bytes){
Console.Write(item.ToString("X2") + " ");
}
Console.WriteLine(String.Empty);

再次執(zhí)行結(jié)果如下:

 

這里我們發(fā)現(xiàn)用StreamWriter.Write輸出多出了EF BB BF這3個(gè)字節(jié)

Google一下:多出來的這個(gè)玩意是 字節(jié)順序記號(hào)(英語:byte-order mark,BOM)

在維基百科中可以查到:

編碼 表示 (十六進(jìn)制) 表示 (十進(jìn)制)
UTF-8 EF BB BF 239 187 191
UTF-16(大端序) FE FF 254 255
UTF-16(小端序) FF FE 255 254
UTF-32(大端序) 00 00 FE FF 0 0 254 255
UTF-32(小端序) FF FE 00 00 255 254 0 0
UTF-7 2B 2F 76和以下的一個(gè)字節(jié):[ 38 | 39 | 2B | 2F ] 43 47 118和以下的一個(gè)字節(jié):[ 56 | 57 | 43 | 47 ]
en:UTF-1 F7 64 4C 247 100 76
en:UTF-EBCDIC DD 73 66 73 221 115 102 115
en:Standard Compression Scheme for Unicode 0E FE FF 14 254 255
en:BOCU-1 FB EE 28 及可能跟隨著FF 251 238 40 及可能跟隨著255

ok,了解了這個(gè)東西后我們就就需要知道在StreamWriter.Write中能否用代碼控制不輸出這個(gè)BOM嗎?

三、查找解決辦法
開始反編譯StreamWriter.Write這個(gè)方法:

大致猜測(cè)是紅色方框的代碼輸出了BOM信息,ok再進(jìn)去看:

 

果然在這里,看上圖紅框處,GetPreamble方法是獲取編碼的字節(jié)序列,和我們之前查到的信息完全一致。

好下面繼續(xù)找這個(gè)haveWrittenPreamble有沒設(shè)置的可能,在Init方法中找到了它的身影。

 

杯具了,CanSeed沒有set方法,Write之前的Position肯定為0,至此結(jié)束。

四、結(jié)論
由上面的結(jié)論,我們可以確定:

1.如果雙方協(xié)議無BOM時(shí),可以使用Stream.Write方法來輸出,或者使用StreamWriter.Write時(shí)加入new UTF8Encoding(false)參數(shù)。

2.有BOM時(shí),我們可以通過GetPreamble和Stream.Write來完成StreamWriter.Write的功能。

相關(guān)文章

  • C#中的委托詳解

    C#中的委托詳解

    本文詳細(xì)講解了C#中的委托,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 使用C#實(shí)現(xiàn)解析Excel公式

    使用C#實(shí)現(xiàn)解析Excel公式

    在日常工作中,我們經(jīng)常需要在Excel中使用公式對(duì)表中數(shù)據(jù)進(jìn)行計(jì)算和分析,所以本文小編主要來和大家介紹一下如何在C#中實(shí)現(xiàn)解析Excel公式,感興趣的可以了解下
    2024-02-02
  • C#9.0 新特性簡(jiǎn)介

    C#9.0 新特性簡(jiǎn)介

    這篇文章主要介紹了C#9.0 新特性簡(jiǎn)介,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 5分鐘用C#實(shí)現(xiàn)串口助手

    5分鐘用C#實(shí)現(xiàn)串口助手

    本文主要介紹了C#實(shí)現(xiàn)串口助手,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C#面向?qū)ο笤O(shè)計(jì)的七大原則

    C#面向?qū)ο笤O(shè)計(jì)的七大原則

    這篇文章主要為大家詳細(xì)介紹了C#面向?qū)ο笤O(shè)計(jì)的七大原則,未讀文章之前大家說一說都有哪七大原則,是不是七大原則都可以全部列出,想要了解的朋友可以參考一下
    2016-05-05
  • 淺析C#中結(jié)構(gòu)與類的區(qū)別

    淺析C#中結(jié)構(gòu)與類的區(qū)別

    本文主要對(duì)C#結(jié)構(gòu)與類的區(qū)別進(jìn)行簡(jiǎn)要分析,文中舉了實(shí)例,便于理解,具有很好的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • C#使用GDI+創(chuàng)建縮略圖實(shí)例

    C#使用GDI+創(chuàng)建縮略圖實(shí)例

    這篇文章主要介紹了C#使用GDI+創(chuàng)建縮略圖實(shí)例,是C#程序設(shè)計(jì)中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • c# 方法可變數(shù)量的參數(shù)

    c# 方法可變數(shù)量的參數(shù)

    這個(gè)方法除去params,是一個(gè)普通的方法,接受int數(shù)組,返回組中的所以項(xiàng)之和
    2012-10-10
  • C#檢查指定對(duì)象是否存在于ArrayList集合中的方法

    C#檢查指定對(duì)象是否存在于ArrayList集合中的方法

    這篇文章主要介紹了C#檢查指定對(duì)象是否存在于ArrayList集合中的方法,涉及C#中Contains方法的使用技巧,需要的朋友可以參考下
    2015-04-04
  • c# Winform同一數(shù)據(jù)源多個(gè)控件保持同步

    c# Winform同一數(shù)據(jù)源多個(gè)控件保持同步

    通過對(duì)控件屬性設(shè)置數(shù)據(jù)源綁定,利用Windows數(shù)據(jù)更改通知這一特性,只要訂閱(設(shè)定綁定)的控件都能接收到數(shù)據(jù)的變化通知。 通過DataBindings方法實(shí)現(xiàn)雙向數(shù)據(jù)綁定
    2021-06-06

最新評(píng)論

五河县| 黄浦区| 商丘市| 兴化市| 汉阴县| 公安县| 库尔勒市| 神木县| 东阿县| 中江县| 乌审旗| 淄博市| 柏乡县| 仁怀市| 平阳县| 洪雅县| 临夏市| 浦北县| 天柱县| 葵青区| 塔河县| 鄂托克旗| 吉首市| 大埔县| 彝良县| 双鸭山市| 长汀县| 大宁县| 高平市| 丽水市| 阿瓦提县| 馆陶县| 蓬安县| 尉氏县| 临桂县| 金湖县| 岳普湖县| 昆明市| 丰都县| 常熟市| 广河县|