dotnet中Stream、string及byte[]的相關操做

string與byte[](UTF-8)

//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與byte[](ASCII)

//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);

string與byte[](GBK)

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);

byte[]與MemoryStream

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與MemoryStream

string與byte[]互轉,byte[]與MemoryStream互轉,因此這個就不是問題了。ide

byte[]與Stream

不是全部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));
}

string與文件

因爲咱們常常要讀取文本文件,或把文本寫到文件中去,因此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

string與Stream

若是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)」中的描述。內存

相關文章
相關標籤/搜索