亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Stream.Write 與 StreamWriter.Write 的不同

 更新時間:2013年04月24日 14:55:16   作者:  
Stream.Write 與 StreamWriter.Write 是我們在向流中寫數(shù)據(jù)時,最常用的方法。下面就詳細(xì)講解這兩個方法。

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


1

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

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

2

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

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

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

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

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

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

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

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

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

二、深究原因
下面繼續(xù)深究一下這個多出來的3個字節(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個字節(jié)

Google一下:多出來的這個玩意是 字節(jié)順序記號(英語: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和以下的一個字節(jié):[ 38 | 39 | 2B | 2F ] 43 47 118和以下的一個字節(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,了解了這個東西后我們就就需要知道在StreamWriter.Write中能否用代碼控制不輸出這個BOM嗎?

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

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

 

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

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

 

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

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

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

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

相關(guān)文章

  • C#?讀寫編輯INI文件的操作

    C#?讀寫編輯INI文件的操作

    INI就是擴(kuò)展名為"INI"的文件,其實(shí)他本身是個文本文件,可以用記事本打開,主要存放的是用戶所做的選擇或系統(tǒng)的各種參數(shù),這篇文章主要介紹了C#讀寫編輯INI文件的操作,需要的朋友可以參考下
    2023-05-05
  • C#操作Windows服務(wù)類System.ServiceProcess.ServiceBase

    C#操作Windows服務(wù)類System.ServiceProcess.ServiceBase

    這篇文章介紹了C#操作Windows服務(wù)類System.ServiceProcess.ServiceBase,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C# 獲取當(dāng)前月份天數(shù)的三種方法總結(jié)

    C# 獲取當(dāng)前月份天數(shù)的三種方法總結(jié)

    本篇文章主要是對C#中獲取目前月份的天數(shù)的三種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#異步編程幾點(diǎn)需要注意的地方

    C#異步編程幾點(diǎn)需要注意的地方

    這篇文章我們來討論下關(guān)于C#異步編程幾個不成文的建議,希望對你寫出高性能的異步編程代碼有所幫助
    2020-05-05
  • Unity實(shí)現(xiàn)游戲傷害數(shù)字顯示HUD的方法

    Unity實(shí)現(xiàn)游戲傷害數(shù)字顯示HUD的方法

    游戲中收到傷害掉血,會有飄動的傷害數(shù)值,本文主要介紹Unity實(shí)現(xiàn)游戲傷害數(shù)字顯示HUD的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C#實(shí)現(xiàn)矩陣乘法實(shí)例分析

    C#實(shí)現(xiàn)矩陣乘法實(shí)例分析

    這篇文章主要介紹了C#實(shí)現(xiàn)矩陣乘法的方法,實(shí)例分析了通過C#數(shù)組構(gòu)造矩陣及實(shí)現(xiàn)矩陣乘法的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 如何使用C#程序給PDF文件添加編輯域

    如何使用C#程序給PDF文件添加編輯域

    本文主要給大家分享的是通過C#操作PDF類庫iTextSharp來實(shí)現(xiàn)在在PDF文檔中填寫日期或簽名之類的能編輯的文本域,非常的簡單實(shí)用,有需要的小伙伴可以參考下。
    2017-01-01
  • C#中Winfrom默認(rèn)輸入法的設(shè)置方法

    C#中Winfrom默認(rèn)輸入法的設(shè)置方法

    這篇文章主要介紹了C#中Winfrom默認(rèn)輸入法的設(shè)置方法,以實(shí)例形式較為詳細(xì)的分析了C#中輸入法設(shè)置的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Unity如何獲取Texture內(nèi)存大小方法詳解

    Unity如何獲取Texture內(nèi)存大小方法詳解

    這篇文章主要為大家介紹了Unity如何獲取Texture內(nèi)存大小方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 在WPF中使用Interaction.Triggers

    在WPF中使用Interaction.Triggers

    這篇文章介紹了在WPF中使用Interaction.Triggers的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論