Я читаю файл в byte[] buffer
. Файл содержит много строк UTF-16 (миллионов) в следующем формате:
- Первый байт содержит и длину строки в символах (диапазон 0 .. 255)
- Следующие байты содержат строковые символы в кодировке UTF-16 (каждый символ, представленный 2 байтами, означает byteCount = charCount * 2).
Мне нужно выполнить стандартные строковые операции для всех строк в файле, например: IndexOf
, EndsWith
и StartsWith
, с StringComparison.OrdinalIgnoreCase
и StringComparison.Ordinal
.
Пока мой код сначала преобразовывает каждую строку из байтового массива в тип System.String
. Я считаю следующий код наиболее эффективным для этого:
// position/length validation removed to minimize the code
string result;
byte charLength = _buffer[_bufferI++];
int byteLength = charLength * 2;
fixed (byte* pBuffer = &_buffer[_bufferI])
{
result = new string((char*)pBuffer, 0, charLength);
}
_bufferI += byteLength;
return result;
Тем не менее, new string(char*, int, int)
это очень медленно, потому что он выполняет ненужных копирование для каждой строки .
Профилировщик говорит, что System.String.wstrcpy(char*,char*,int32)
работает медленно.
Мне нужен способ выполнения строковых операций без копирования байтов для каждой строки .
Есть ли способ выполнить строковые операции с байтовым массивом напрямую ?
Есть ли способ создать новую строку без копирования ее байтов?