//string to byte[] string str = "abc中文"; //0x61 0x62 0x63 0xE4 0xB8 0xAD 0xE6 0x96 0x87 byte[] bytes = Encoding.UTF8.GetBytes(str); //byte[] to string //abc中文 str = Encoding.UTF8.GetString(bytes);
//string to byte[] string str = "abc中文"; //注意:因爲ASCII不支持中文,中文轉碼失敗會變成問號(0x3F) //0x61 0x62 0x63 0x3F 0x3F byte[] bytes = Encoding.ASCII.GetBytes(str); //byte[] to string //abc?? str = Encoding.ASCII.GetString(bytes); Console.WriteLine(str);
GBK是GB2312的擴展,其實如今所使用的GB碼都是GBK編碼,GB2312早就是過去時,但GB2312這個名字因爲用了過久,慣性太大,因此一直保留着,並在在當今GB2312與GBK這兩個名稱被看做是等價的。在dotnet core中,GBK編碼默認不被支持,必須引入nuget包:System.Text.Encoding.CodePages,且在程序入口處註冊:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);緩存
//string to byte[] string str = "abc中文"; //0x61 0x62 0x63 0xD6 0xD0 0xCE 0xC4 byte[] bytes = Encoding.GetEncoding("GBK").GetBytes(str); //byte[] to string //abc中文 str = Encoding.GetEncoding("GBK").GetString(bytes);
Stream其實就是對byte[]的一種抽象與封裝,計算機世界裏的一切代碼數據,其實均可以看作Stream,裏面包含的是一個個有次序的字節。固然了,跟byte[]相比,Stream一般不能隨機訪問。MemoryStream表示內存中的Stream,數據存在於內存中,因此它是一個能隨機訪問的Stream。byte[]與MemoryStream之間能很是方便地轉換。網絡
//byte[] to MemoryStream byte[] bytes = {0x61, 0x62, 0x63, 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87}; MemoryStream ms = new MemoryStream(bytes); //MemoryStream to byte[] bytes = ms.ToArray();
string與byte[]互轉,byte[]與MemoryStream互轉,因此這個就不是問題了。ide
不是全部Stream都像MemoryStream同樣能直接和byte[]互轉,好比說FileStream,那怎麼辦呢?不能直接轉,那就使用「讀寫」這兩個動做啊,寫到Stream去,以及從Stream中讀取。編碼
//byte[] to Stream byte[] bytes = {0x61, 0x62, 0x63, 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87}; using (FileStream fs = File.Create("d:\\test.txt")) { fs.Write(bytes); } //Stream to byte[] using (FileStream fs = File.OpenRead("d:\\test.txt")) { bytes = new byte[fs.Length]; fs.Read(bytes); Console.WriteLine(BytesToHexString(bytes)); }
因爲咱們常常要讀取文本文件,或把文本寫到文件中去,因此dotnet提供了兩個簡便方法,讓咱們能夠無論FileStream。spa
string str = "ABC中文"; //string to file File.WriteAllText("d:\\test.txt", str); //file to string str = File.ReadAllText("d:\\test.txt");
注意,這兩個方法都是認爲文件使用了UTF-8編碼。另外我是推薦使用這兩個方法快速訪問文本文件的,由於不一樣編碼格式的文本文件其實還有個字節序標記(BOM,Byte Order Mark)的概念,不過這裏就不展開了。code
若是Stream來自於網絡,沒有File.ReadAllText這種方法,那應該怎麼作?你固然能夠用Stream的Read/Write方法,但讀出來byte[]以後還須要再轉爲string,有點周折。因此dotnet引入了兩個對象,StreamReader和StreamWriter,用它們能夠實現string到Stream之間的轉換。(爲簡單起見,下面的例子依然使用FileStream)對象
//Write string to Stream using (FileStream fs = File.Create("d:\\test.txt")) { StreamWriter writer = new StreamWriter(fs); writer.Write("ABC中文"); writer.Flush(); } //Read string from Stream using (FileStream fs = File.OpenRead("d:\\test.txt")) { StreamReader reader = new StreamReader(fs) string str = reader.ReadToEnd();//也能夠用ReadLine逐行讀取 }
注意1:writer自帶緩存調用Flush方法確保數據已經寫入流中,另外一種方法是將writer包到using代碼塊中,例子見下
注意2:StreamWriter和StreamReader默認使用UTF-8編碼,若是要換一種編碼方式,須要手動指定,例子見下blog
//Write string to Stream using (FileStream fs = File.Create("d:\\test.txt")) { using (StreamWriter writer = new StreamWriter(fs, Encoding.GetEncoding("GBK"))) { writer.Write("ABC中文"); } } //Read string from Stream using (FileStream fs = File.OpenRead("d:\\test.txt")) { StreamReader reader = new StreamReader(fs, Encoding.GetEncoding("GBK")); string str = reader.ReadToEnd();//也能夠用ReadLine逐行讀取 }
注意:要使用GBK編碼,請參考「string與byte[](GBK)」中的描述。內存