日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

【转】C#中StreamWriter与BinaryWriter的区别兼谈编码。

發布時間:2023/12/10 C# 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】C#中StreamWriter与BinaryWriter的区别兼谈编码。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:

1. 《C#高級編程》第六版

2.??文件流和數據流-C#程序設計教程

?

2010-7-11補充:

  發現了一篇講編碼的深入而全面的好文章http://www.cnblogs.com/KevinYang/archive/2010/06/18/1760597.html

向文件寫入非字符類型數據

當向文件中寫入非字符類型的數據時,StreamWriter和BinaryWriter存在巨大差異。


StreamWriter是把各種類型的數據都轉化成字符,然后把字符按照一定的格式編碼出來的數據寫入文件中。


BinaryWriter是直接把數據在內存中的真實狀態寫入到文件中。

例子:

class Program {static void Main(string[] args){ FileStream fs = File.Open("E:\\MyFile.txt", FileMode.OpenOrCreate, FileAccess.Write);StreamWriter sw = new StreamWriter(fs);BinaryWriter bw = new BinaryWriter(fs);sw.Write(100);bw.Write(100); } }


??????? 用UEdit查看MyFile.txt的16進制碼.
??????? sw的輸出為31 30 30,占三個字節。代表了'1', '0', '0'的ASCII碼。它輸出的全是文本數據。
??????? bw的輸出為64 00 00 00 ,占四個字節。這正是100在內存中的真實狀態。int類型占四個字節。


??????? 用記事本打開,sw的輸出顯示為:"100", bw的輸出顯示為 "d?? ", 因為100對應了ASCII碼的d。

?

BinaryWriter寫進去的東西,StreamReader是認不出來的,只能用BinaryReader的對應方法來讀取,程序員記住自己是用什么方式寫的,然后在用BinaryReader讀取時,指定好匹配的編碼方式,就可以將原來的數據還原了。???
??????? 你當初寫進去的是int型,就用BinaryReader.ReadInt32()來讀取。???
??????? 例如剛才寫進去的100,可以這樣讀取:

class Program{static void Main(string[] args){ FileStream fs = File.Open("E:\\MyFile.txt", FileMode.Open, FileAccess.Read);BinaryReader br = new BinaryReader(fs);int a = br.ReadInt32(); }}


??????? 這樣,a就等于100了

?

另外的例子:

BinaryWriter bw = new BinaryWriter(fs, Encoding.UTF32);bw.Write('a');輸出為:61 00 00 00,占4字節,這就是字符'a'用UTF32格式編碼的結果。 讀取這個輸出 BinaryReader br = new BinaryReader(fs, Encoding.UTF32);Console.WriteLine(br.ReadChar()); BinaryWriter bw = new BinaryWriter(fs, Encoding.ASCII);bw.Write('a');輸出為:61,占1字節,這就是字符'a'用ACSII格式編碼的結果。讀取這個輸出 BinaryReader br = new BinaryReader(fs, Encoding.ASCII);Console.WriteLine(br.ReadChar());

?

?

文件的本質:

?

所謂的.txt文件,本質不過是硬盤上一堆二進制數據而已。

往文件中寫文本,就是把文本所對應的編碼(也就是數字)寫進txt文件。

?

當你用記事本打開一個txt,就是使用“記事本”這個程序對這堆二進制數據進行解釋。
比方說記事本在txt中讀到了一個64H,然后記事本去ASCII字庫里查詢64H代表什么字符,查到它代表‘d’,于是記事本就負責把‘d’這個字符給顯示出來。其實文件里存的不是‘d’,而是‘d’的ASCII編碼。

?

但問題是,世界上存在多種編碼方式,也就對應了不同的字庫,比如GBK, 比如Big5, 比如Unicode,同樣的編碼在不同的字庫中對應了不同的字。所以記事本對二進制數據進行解釋的時候,需要知道這些數據使用什么方式編碼,才能去對應的字庫查它是哪個字。所以文件頭有時候會有一些標識數據,用來提示記事本這個txt是用什么方式編碼。

?

比如:文件頭的FF FE意味著本文用Unicode格式編碼。而FE FF意味著用BigEndianUnicode方式。所以FF FE 8B 73 被解釋為'王', FE FF 8B 73被解釋為‘譳’。

?

我們新建一個文本文檔,輸入'王',然后查看其16進制的數據,發現文檔數據為:CD F5。這是默認編碼格式下的'王'的編碼。
然后將該文本文檔另存為Unicode格式的,發現其16進制數據變成了:FF FE 8B 73。
再另存為Unicode big endin之后,16進制數據變為:FE FF 73 8B。
這些底層數據的變化過程是由記事本程序來維護的,但無論底層數據怎么變動,我們看到的文本都是不變的。記事本程序并負責格式轉換并保證只改變編碼方式而不改變文本。

?

出現亂碼,就是對二進制數據進行了錯誤的解釋。

?

向文件中寫入字符數據時


當用于寫字符的時候,StreamWriter和BinaryWriter是差不多的。二者稍有區別。

看下面的例子:

? FileStream fs = File.Open("E:\\MyFile.txt", FileMode.OpenOrCreate, FileAccess.Write);StreamWriter sw = new StreamWriter(fs, Encoding.Unicode); sw.Write(‘王’); MyFile.txt內容為:FF FE 8B 73StreamWriter sw = new StreamWriter(fs, Encoding.BigEndianUnicode); sw.Write(‘王’); MyFile.txt內容為:FE FF 73 8B BinaryWriter bw = new BinaryWriter(fs, Encoding.Unicode); bw.Write(‘王’); MyFile.txt內容為:8B 73BinaryWriter bw = new BinaryWriter(fs, Encoding.BigEndianUnicode); bw.Write(‘王’); MyFile.txt內容為:73 8B

?


??????????? 當新建的時候,StreamWriter會順便寫入FF FE這樣的標識數據,而BinaryWriter不會寫入任何表示數據,只把'王'的編碼寫入文件。
??????????? 當append的時候,StreamReader設定的編碼方式是不會改變文檔原有的編碼方式的。

舉例來說。

?
?????? 有一個空的Unicode格式的MyFile.txt,該txt文件中只有兩個字節的數據:FF FE。

?????? 執行如下代碼:


?????? FileStream fs = File.Open("E:\\MyFile.txt", FileMode.Append, FileAccess.Write);
?????? StreamWriter sw = new StreamWriter(fs);
?????? sw.Write('王');


?????? 執行之后,MyFile.txt內的數據為:FF FE E7 8E 8B, 其中E7 8E 8B是StreamWriter采用默認編碼格式對'王'進行編碼的結果。
?????? 當記事本程序試圖將FF FE E7 8E 8B解釋成文本時,遇到FF FE會認為這是Unicode編碼,于是把后邊的所有數據都按照Unicode的格式解釋,于是E7 8E 8B被解釋成了亂碼。把FF FE 改成00 00 之后,記事本找不到FF FE,于是就把這一坨數據按照默認方式解釋,這就正確地將E7 8E 8B解釋成了‘王’字。

總結

以上是生活随笔為你收集整理的【转】C#中StreamWriter与BinaryWriter的区别兼谈编码。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。