@Drottarutarnum
Любопытный любитель

Как преобразовать тип ReadOnlySpan?

У меня есть код который парсит файл побайтно, внутри есть что-то типо такого (упрощено)
int DeserializeObject(ReadOnlySpan<byte> bytes) {
    var chars = Encoding.ASCII.GetString(bytes);
    return int.Parse(chars);
}


Парсинг чисел (int.Parse) может принимать ReadOnlySpan, но только типа char, а не byte

Просто использование выделения памяти для строк с помощью Encoding.ASCII.GetString замедляет работу кода в 5-6 раз, я хотел бы передавать срез байтов напрямую чтобы преобразовать их в числа

Так вот, какой есть способ из ReadOnlySpan сделать ReadOnlySpan не выделяя памяти? Или, делая это очень ограничено и быстро?

Или возможно есть другой способ преобразовать ReadOnlySpan в число?
Внутри ReadOnlySpan хранятся обычные символы с представлением числа в виде строки

Или возможно стоит сделать свою реализацию int.Parse? Будет ли это быстрее?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 2
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Если нет заморочек с кодировками, то каст должен сработать:
ReadOnlySpan<char> charsSpan = MemoryMarshal.Cast<byte, char>(bytes);

https://learn.microsoft.com/en-us/dotnet/api/syste...

И судя по исходникам, каст не выделяет новую память: https://source.dot.net/#System.Private.CoreLib/src...
Ответ написан
Комментировать
WNeZRoS
@WNeZRoS
Из ReadOnlySpan<byte> можно распарсить число при помощи System.Buffers.Text.Utf8Parser.TryParse
Пример использования можно увидеть в этой статье.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
потому что byte равен char в очень ограниченных случаях. Напиши конвертер сам, там три строчки кода: отнять x20 умножить на 10.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы