IReadOnlyList<byte>
给定一个特定的,有没有办法从一个字符串中取出一个字符串Encoding
?
更准确地说,有没有办法在将集合的内容传递给 Encoding 对象之前不复制它?
我主要关心的是性能,其次是内存使用。
IReadOnlyList<byte>
给定一个特定的,有没有办法从一个字符串中取出一个字符串Encoding
?
更准确地说,有没有办法在将集合的内容传递给 Encoding 对象之前不复制它?
我主要关心的是性能,其次是内存使用。
首先,您必须测试您使用的是单字节编码还是双字节编码。
如果您使用的是单字节编码,您可以简单地 Linq 使用 Select 和 Encoding.GetString(byte); 将字节值直接查询为字符串;
如果您使用双字节编码,则可以一次将两个字节枚举到缓冲区中。由于您会将值类型(字节)重写到数组元素中,因此在此过程中您只会使用两个字节的存储空间,尽管您将复制每个字节。
我认为它看起来像这样,但请注意:我在这台机器上没有编译器,所以我无法验证语法(这是 C#-ish 代码:))
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;
}
我们现在有人致力于字符串和字节序列的高性能和零拷贝解析。
https://github.com/dotnet/corefxlab/blob/master/docs/specs/parsing.md