web-dev-qa-db-ja.com

スパンへのポインタを取得できますか?

文字列をデコードしたい_(ReadOnly)Span<byte>_があります。

.NET Core 2.1でのみ、バイトをコピーせずに文字列をデコードするための新しいオーバーロードがあります。

_Encoding.GetString(ReadOnlySpan<byte> bytes);
_

.NET Standard2.0および.NET4.6(これもサポートしたい)では、古典的なオーバーロードしかありません。

_Encoding.GetString(byte[] bytes);
Encoding.GetString(byte* bytes, int byteCount);
_

最初のものは、私が避けたい配列へのバイトのコピーを必要とします。
2番目にはバイトポインタが必要なので、スパンから1つ取得することを考えました。

_Encoding.GetString(Unsafe.GetPointer<byte>(span.Slice(100)))
_

...しかし、私はそのための実際の方法を見つけることができませんでした。 void* Unsafe.AsPointer<T>(ref T value)を試しましたが、スパンを渡すことができず、ポインター(およびスパン)を処理する別のメソッドが見つかりませんでした。

これはまったく可能ですか?もしそうなら、どのように?

7
Ray

これを試して:

Span<byte> bytes = ...;
string s = Encoding.UTF8.GetString((byte*)Unsafe.AsPointer(ref bytes.GetPinnableReference()),
    bytes.Length);
2
mm8