Как эффективно читать строку с нулевым завершением, не Unicode, из неуправляемой памяти

Мне нужно прочитать несколько тысяч строк C с нулевым завершением из памяти.

Мое текущее решение выглядит следующим образом

byte* stringPointer; // Obviously has an actual value in my codebase

var stringLength = 0;

while (*(stringPointer + stringLength) != 0x00) 
{
    stringLength += 1;
}

var unmanagedString = Encoding.UTF8.GetString(stringPointer, stringLength);

Это отлично работает, но мне просто интересно, есть ли более эффективный способ сделать это, учитывая, что я читаю тысячи этих строк каждый раз, когда вызывается эта функция.

Любые идеи?


person Kermitty    schedule 27.11.2019    source источник
comment
Отвечает ли это на ваш вопрос? Чтение строки с завершающим нулем   -  person Jazb    schedule 27.11.2019
comment
Есть идеи? -- это почти самое определение слишком широкого. Что не так с кодом, который у вас есть сейчас? Существует множество различных способов маршалирования строк с нулевым символом в конце из неуправляемой памяти в управляемые объекты. Лучшие методы будут использовать API взаимодействия .NET. Я читаю тысячи этих строк каждый раз, когда вызывается эта функция. -- и как часто вы вызываете эту функцию? 1000 строк - это разовая прогулка. Вы должны делать это довольно часто, чтобы быть проблемой; в этот момент вы должны спросить, нужно ли вам так много строк так часто.   -  person Peter Duniho    schedule 27.11.2019


Ответы (1)


В C# Marshal.PtrToStringUTF8 принимает указатель на строку UTF-8 в стиле C и возвращает управляемый string.

var mystring = Marshal.PtrToStringUTF8(stringPointer);

Наверное, это был бы самый действенный способ.

Обратите внимание, что базовая операция по-прежнему O(N), поскольку она включает копирование, плюс C# string должен знать длину.

person rustyx    schedule 27.11.2019