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