c# Возврат Null терминированной строки из ReadOnlySpan

Есть ReadOnlySpan<byte> в нём на определённом месте содержится строка которую надо извлечь. Длинну строки заранее мы не знаем, но знаем что она null terminated и знаем точный offset начала этой строки в массиве. в с++ я бы сделал так:

string favorite(&buffer[600]);

Для C# пришлось сделать так:

var indexInSlice = bytes.Slice(600).IndexOf(Convert.ToByte(0x00));
return Encoding.ASCII.GetString(bytes.Slice(600, indexInSlice));

Нет ли более удобного способа получить эту строку?


Ответы (1 шт):

Автор решения: aepot

С вашим кодом все впорядке, ну разве что можно использовать System.Range вместо .Slice()

ReadOnlySpan<byte> stringBytes = bytes[600..];
int index = stringBytes.IndexOf((byte)0);
return Encoding.ASCII.GetString(stringBytes[..index]));

Есть у меня еще такой метод, который в принципе сути не меняет

private static string ReadStringZ(ReadOnlySpan<byte> buffer)
{
    int i = 0;
    while (i < buffer.Length && buffer[i] != 0)
        i++;
    return Encoding.ASCII.GetString(buffer[..i]);
}
string text = ReadStringZ(data[600..]);

Достаточно быстро работает, не требует дополнительно памяти, из пачки байт сразу получается строка.

А вообще есть такой класс BinaryReader, если у вас поток данных, то их можно считывать вообще посимвольно (сразу в ASCII) сразу в строку. Просто открываете файл, подсовываете файловый поток в BinaryReader и читаете сразу в нужные типы данных. Метод выше - копия моего метода, выполняющая ту же функцию, но только там у меня ReadOnlySpan<char>, и я возвращаю значение как new string(buffer[..i]).

→ Ссылка