Можно ли сделать строку из фрагмента байтового массива, не создавая копию массива? (Массив может быть довольно большим, поэтому я хочу не делать его кратным в памяти)
Мой текущий код предполагает использование 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
?
3 ответа
GetString
имеет перегрузка, которая принимает существующий массив, начальный индекс и длину, поэтому вы должны быть в состоянии сделать:
var outputString = Encoding.UTF8.GetString(
inputArray,
bytesToTrim.Length,
inputArray.Length - bytesToTrim.Length);
Но обратите внимание, что вы, похоже, не смотрите на содержимое bytesToTrim
, а просто на длину, поэтому неясно, какова связь между этими двумя массивами.
В .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>
.
Вы можете попробовать использовать класс Span: https://docs.microsoft.com/en-us/dotnet/api/system.span-1.slice?view=netcore-3.1
Это поможет вам избежать любого выделения.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.