IReadOnlyList<byte>
特定の を指定して、 から文字列を取得する方法はありEncoding
ますか?
より正確には、コレクションの内容を Encoding オブジェクトに渡す前にコピーしない方法はありますか?
私の主な関心事はパフォーマンスであり、次にメモリ使用量です。
IReadOnlyList<byte>
特定の を指定して、 から文字列を取得する方法はありEncoding
ますか?
より正確には、コレクションの内容を Encoding オブジェクトに渡す前にコピーしない方法はありますか?
私の主な関心事はパフォーマンスであり、次にメモリ使用量です。
現在、文字列とバイト シーケンスの高パフォーマンスでゼロ コピーの解析に取り組んでいる人がいます。
https://github.com/dotnet/corefxlab/blob/master/docs/specs/parsing.md
まず、1 バイトまたは 2 バイトのエンコーディングを使用しているかどうかをテストする必要があります。
シングル バイト エンコーディングを使用している場合は、Linq で Select および Encoding.GetString(byte); を使用してバイト値を文字列に直接クエリすることができます。
デュアルバイト エンコーディングを使用している場合は、一度に 2 バイトを列挙してバッファに入れることができます。値型 (バイト) を配列要素に再書き込みするため、各バイトをコピーすることになりますが、プロセス中に 2 バイトのストレージしか使用しません。
私はそれがこのように見えると思いますが、注意してください: 私はこのマシンにコンパイラを持っていないので、構文を検証できません (これは C# 風のコードです :) )
public string example(IReadOnlyList<byte> someListIGotSomewhere, Encoding e)
{
string retVal = null;
if(e.IsSingleByte)
{
retVal = string.Join("",someListIGotSomewhere.Select(b=>e.GetString(new byte[]{b})));
}
else
{
StringBuilder sb = new StringBuilder(someListIGotSomewhere.Count()/2);
var enumerator = someListIGotSomewhere.GetEnumerator();
var buffer = new byte[2]
while(enumerator.MoveNext())
{
buffer[0] = enumerator.Current;
buffer[1] = enumerator.MoveNext()?enumerator.Current:0;
sb.Append(e.GetString(buffer));
}
retVal = sb.ToString();
}
return retVal;
}