来自IReadOnlyList的Encoding.GetString<;字节>;

本文关键字:lt 字节 gt GetString IReadOnlyList Encoding 来自 | 更新日期: 2023-09-27 18:24:42

在给定特定的Encoding的情况下,有没有办法从IReadOnlyList<byte>中获取字符串?

更准确地说,有没有一种方法在将集合的内容传递给Encoding对象之前不复制集合的内容?

我主要关心的是性能,其次是内存使用情况。

来自IReadOnlyList的Encoding.GetString<;字节>;

首先,您必须测试使用的是单字节编码还是双字节编码。

如果您使用的是单字节编码,您可以简单地使用Select和encoding.GetString(byte)将字节值直接查询为字符串;

如果您使用的是双字节编码,那么您可以一次在缓冲区中增加两个字节。由于要将值类型(字节)重写到数组元素中,因此在此过程中只会使用两个字节的存储空间,尽管要将每个字节都复制出去。

我想它看起来像这样,但请注意:我在这台机器上没有编译器,所以我无法验证语法(这是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;
}

我们现在有人在研究字符串和字节序列的高性能和零拷贝解析。

https://github.com/dotnet/corefxlab/blob/master/docs/specs/parsing.md