我正在FCL中寻找一种类似于的方法Encoding.UTF8.GetString(bytes, index, count)
,但它不需要count
参数,而是假定给定索引处的字符串以空值结尾。
我将我当前的解决方案作为答案发布(见下文),但很想知道是否有人知道更优雅或性能更好的方法。
因为我在 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.");
}
}
虽然这可行,但它有一个小问题:假设除了 UTF-8 编码之外的任何字符都'\0'
不会包含一个0
字节。虽然情况确实如此,但如果该假设被完全封装在Encoding.UTF8
类中会更好。