У меня есть (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, по крайней мере, я не проверял, будет ли он действительно работать (у меня есть только более поздние фреймворки установлены). - person Jeroen Mostert   schedule 18.01.2019ref GetPinnableReference()
в качестве аргумента дляUnsafe.AsPointer
. Вам нужно как минимум C# 7.0, чтобы использоватьref
locals. - person Jeroen Mostert   schedule 18.01.2019