Можно ли сделать строку из фрагмента байтового массива, не создавая копию массива? (Массив может быть довольно большим, поэтому я хочу не делать его кратным в памяти)

Мой текущий код предполагает использование Array.Copy:

var trimmedArray = new byte[inputArray.Length - bytesToTrim.Length];
Array.Copy(inputArray, bytesToTrim.Length, trimmedArray, 0, trimmedArray.Length);
var outputString = Encoding.UTF8.GetString(trimmedArray);

Можно ли получить outputString без копирования inputArray в trimmedArray?

1
Erresen 27 Янв 2020 в 18:50

3 ответа

Лучший ответ

GetString имеет перегрузка, которая принимает существующий массив, начальный индекс и длину, поэтому вы должны быть в состоянии сделать:

var outputString = Encoding.UTF8.GetString(
                       inputArray, 
                       bytesToTrim.Length, 
                       inputArray.Length - bytesToTrim.Length);

Но обратите внимание, что вы, похоже, не смотрите на содержимое bytesToTrim, а просто на длину, поэтому неясно, какова связь между этими двумя массивами.

3
D Stanley 27 Янв 2020 в 15:56

В .NET Core 2.1+ (или с использованием System.Memory пакета NuGet с. NET Framework 4.5+) вы можете преобразовать массив в Span<byte> и нарезать его:

var outputString = Encoding.UTF8.GetString(inputArray.AsSpan().Slice(length));

Пожалуйста, обратитесь к article для получения дополнительной информации о типе Span<T>.

2
mm8 27 Янв 2020 в 16:05

Вы можете попробовать использовать класс Span: https://docs.microsoft.com/en-us/dotnet/api/system.span-1.slice?view=netcore-3.1

Это поможет вам избежать любого выделения.

1
schglurps 27 Янв 2020 в 16:03