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 шт):
С вашим кодом все впорядке, ну разве что можно использовать 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]).