[c#]stringとbyte配列変換の高速方法(unsafeを採用)

1736 ワード

最近、C#のstringとbyteの相互変換の問題に遭遇しました.通常の方法では、次の方法で変換します.
1. string -> byte[]
   byte[] data = System.Text.Encoding.Unicode.GetBytes(var);//var is string
2. byte[] -> string
   string var = System.Text.Encoding.Unicode.GetString(data, 0, data.Length);//data is byte[]
注意:DefaultではなくUnicodeを使用します.主にC#のstringのストレージフォーマットがUnicodeの標準形式であり、1文字に2バイトを使用します.もちろん具体的にどのように変換するかはあなたの考え次第で、Defaultは最も空間を節約する方法を採用しています.
この方法は標準的な方法で、間違いなく正しいが、速くない.unsafe法を用いて効率を向上させることができる.具体的な方法は以下の通りです.
1. string -> byte[]
fixed (char* str = var)   //var is string
            {
                fixed (byte* ptr = data)    //data is byte[]
                {
                    byte* bstr = (byte*)str;      //---------------------1
                    for (int i = 0; i < var.Length * 2; i++)
                    {
                        ptr[i++] = bstr[i];
                    }
                }
            }

2. byte[] -> string
 char[] tvar = new char[length / 2];
            fixed (char* str = tvar)
            {
                fixed (byte* ptr = data)
                {
                    byte* pstr = (byte*)str;      //-----------------------2
                    for (int i = 0; i < data.Length; i++)
                    {
                        pstr[i] = ptr[i];
                    }
                }
            }
            string var = new string(tvar);

           
注意:a.stringでは1文字あたり2バイトを占めるのでbyte配列に変換する場合は、長さに2を乗じ、逆に2を割ることに注意してください.
b.1,2タグにbyteバイトへの強制変換があります.これは、次のfor文のコピーを容易にするためです.そうしないと、1つのc#の1つのcharも2バイトになります.
 
テストの結果、単純な中国語と英語の混合文字列を100000回変換し、書き込み文字列は10倍速く、読み取り文字列は約2倍速く、これは最後にstringオブジェクトを作成したためである.