dotnetにおけるStream、stringおよびbyte[]に関する操作

10881 ワード

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はGB 2312の拡張であり、実際に現在使用されているGBコードはすべてGBKコードであり、GB 2312は以前から過去のものであったが、GB 2312という名前は長く使われすぎて慣性が大きいため、ずっと残っており、現在のGB 2312とGBKの2つの名前は等価とされている.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と互いに回転するので、これは問題ではありません.

byte[]とStream


すべてのStreamがMemoryStreamのようにbyte[]と直接回転できるわけではありません.例えばFileStreamですが、どうすればいいですか.直接回転することはできませんが、「読み書き」という2つの動作を使いましょう.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を気にしない2つの簡単な方法を提供しています.
string str = "ABC ";

//string to file
File.WriteAllText("d:\\test.txt", str);

//file to string
str = File.ReadAllText("d:\\test.txt");

なお、この2つの方法は、ファイルがUTF-8符号化されていると考えられる.また、この2つの方法でテキストファイルに素早くアクセスすることをお勧めします.異なる符号化フォーマットのテキストファイルにはバイト順タグ(BOM,Byte Order Mark)の概念がありますが、ここでは展開しません.

stringとStream


Streamがネットワークから来た場合、Fileはありません.ReadAllTextという方法は、どうすればいいですか?もちろんStreamのRead/Writeメソッドは使えますが、byte[]を読んでからstringに移行する必要があり、少し紆余曲折があります.したがってdotnetでは、stringからStreamへの変換を実現する2つのオブジェクト、StreamReaderとStreamWriterが導入されています.(単純化のため、以下の例では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メソッドは、ストリームにデータが書き込まれていることを保証します.もう1つの方法は、writerをusingコードブロックにパッケージすることです.例を参照してください.注意2:StreamWriterとStreamReaderのデフォルトではUTF-8符号化が使用されています.符号化方法を変更するには、手動で指定する必要があります.例を参照してください.
//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)」の説明を参照してください.