【发布时间】:2019-06-12 19:57:17
【问题描述】:
我有一个(ReadOnly)Span<byte>,我想从中解码一个字符串。
仅在 .NET Core 2.1 中,我有新的重载来从中解码字符串,而无需复制字节:
Encoding.GetString(ReadOnlySpan<byte> bytes);
在 .NET Standard 2.0 和 .NET 4.6(我也想支持)中,我只有经典的重载:
Encoding.GetString(byte[] bytes);
Encoding.GetString(byte* bytes, int byteCount);
第一个需要将字节复制到我想避免的数组中。
第二个需要一个字节指针,所以我想从我的跨度中获取一个,比如
Encoding.GetString(Unsafe.GetPointer<byte>(span.Slice(100)))
...但我没有找到一个实际的方法。我试过void* Unsafe.AsPointer<T>(ref T value),但我无法将跨度传递给它,也没有找到另一种处理指针(和跨度)的方法。
这有可能吗,如果可以,怎么做?
【问题讨论】:
-
输入
[ReadOnly]Span<T>.GetPinnableReference()。如果使用 C# 7.3,利用它就像fixed (byte* bytes = span)一样简单——它至少可以为 .NET 4.5.2 编译,我还没有测试它是否也能真正工作(我只有以后安装的框架)。 -
在之前的 C# 版本中,您可以使用
ref GetPinnableReference()的返回值作为Unsafe.AsPointer的参数。您至少需要 C# 7.0 才能使用reflocals。 -
@JeroenMostert 这太棒了,我使用的是 C# 7.3,它运行起来像丝绸一样顺畅。你想发布一个关于它的答案以便我接受吗?
-
在 ILSpy 的帮助下,我实际上也为早期版本找到了更方便的语法。也没有经过测试,但由于返回的指针是相同的,我假设它可以工作。
标签: c# .net-standard-2.0 .net-4.6 .net-core-2.1