に似たFCLのメソッドを探してEncoding.UTF8.GetString(bytes, index, count)
いますが、引数を必要とせずcount
、代わりに指定されたインデックスの文字列が null で終わると想定しています。
現在のソリューションを回答として投稿しています(以下を参照)が、誰かがよりエレガントまたはパフォーマンスの高いアプローチを知っているかどうかを知りたいです。
FCL で見つからなかったので、独自のメソッドを作成しました。
using System.Text;
string GetZeroTerminatedUTF8StringAt(byte[] bytes, int index)
{
int zeroTerminatorIndex = Array.IndexOf<byte>(bytes, value: 0, startIndex: index);
if (zeroTerminatorIndex >= index)
{
return Encoding.UTF8.GetString(bytes, index, count: zeroTerminatorIndex - index);
}
else
{
throw new ArgumentOutOfRangeException("index", "No zero-terminator found.");
}
}
これは機能しますが、小さな問題が 1 つあります。UTF-8 エンコーディングで'\0'
は、バイト以外の文字は含まれないと見なされます。これは実際に当てはまりますが、その仮定がクラス0
内に完全にカプセル化されていれば、より良いでしょう。Encoding.UTF8