私はファイルをbyte[] buffer
に読み込んでいます。ファイルには、次の形式でUTF-16文字列(百万人)の多くが含まれていますC#はUTF-16バイト配列で文字列演算を実行します
- 最初のバイト含まれており、文字の文字列の長さ(範囲0 .. 255)
- 、次のバイトは、文字列の文字が含まれていますUTF-16エンコーディング(各文字は2バイトで表され、byteCount = charCount * 2を意味します)。
私は、たとえば、ファイル内のすべての文字列のための標準的な文字列操作を実行する必要があります。IndexOf
、EndsWith
とStartsWith
、StringComparison.OrdinalIgnoreCase
とStringComparison.Ordinal
と。
今のところ私のコードは、バイト列から各文字列をSystem.String
型に変換しています。私は、次のコードは、そうするのが最も効率的であることが判明:
// position/length validation removed to minimize the code
string result;
byte charLength = _buffer[_bufferI++];
int byteLength = charLength * 2;
fixed (byte* pBuffer = &_buffer[_bufferI])
{
result = new string((char*)pBuffer, 0, charLength);
}
_bufferI += byteLength;
return result;
それでも、new string(char*, int, int)
それは、各文字列ため不要コピーを実行するので、それは非常に遅いです。
Profilerは、System.String.wstrcpy(char*,char*,int32)
が遅いとしています。
の文字列ごとにバイトをコピーせずに、文字列操作を実行する方法が必要です。
バイト配列に文字列演算を直接行う方法はありますか??
新しい文字列を作成する方法はありますか?のバイトはコピーされていませんか?
すべての文字がUTF16の2バイトにエンコードされるわけではありません。 –
@Kerrek SB:そうですが、それらの文字は文字列に複数の 'char'値としても格納されます。 – Guffa
@Kerrek SBあなたはコードポイントについて話しています。Microsoftの用語では、文字は2バイトです。 –