Массив байтов Ascii в Int32 или Double
Вопрос
Я переписываю библиотеку с просьбой сделать ее полностью бесплатной.Цель – получить 0 коллекций после завершения этапа запуска приложения.
Раньше было много таких звонков:
Int32 foo = Int32.Parse(ASCIIEncoding.ASCII.GetString(bytes, start, length));
Я считаю, что это выделение строки.Я не смог найти библиотечную функцию C#, которая автоматически делала бы то же самое.Я посмотрел на класс BitConverter, но похоже, что это происходит только в том случае, если ваш Int32 закодирован фактическими байтами, которые его представляют.Здесь у меня есть массив байтов, представляющих символы Ascii, которые представляют Int32.
Вот что я сделал
public static Int32 AsciiBytesToInt32(byte[] bytes, int start, int length)
{
Int32 Temp = 0;
Int32 Result = 0;
Int32 j = 1;
for (int i = start + length - 1; i >= start; i--)
{
Temp = ((Int32)bytes[i]) - 48;
if (Temp < 0 || Temp > 9)
{
throw new Exception("Bytes In AsciiBytesToInt32 Are Not An Int32");
}
Result += Temp * j;
j *= 10;
}
return Result;
}
Кто-нибудь знает библиотечную функцию C#, которая уже делает это более оптимальным способом?Или улучшение, позволяющее ускорить выполнение вышеописанного (вероятно, оно будет вызываться миллионы раз в течение дня).Спасибо!
Решение
Миллионы раз в день не должно быть проблемой — я ожидаю, что это сможет выполняться сотни тысяч раз в секунду.Лично я бы переписал вышеприведенное, чтобы объявлять «temp» только внутри цикла (и избавиться от имен локальных переменных в Pascal-cases - ура), но все должно быть в порядке.
Код будет более понятен как:
int digit = bytes[i] - '0';
который делает то же самое, что и ваш
Temp = ((Int32)bytes[i]) - 48;
линия, но более простым способом (ИМО).Они должны вести себя точно так же.
В общем, попытка написать C# без каких-либо выделений — это довольно жестко и противоречит тому, как спроектирован язык и платформа.Вы верите, что это на самом деле разумное требование?Признаюсь, я слышал, что некоторые игры пишутся с использованием управляемого кода...но это кажется немного странным.
Конечно, вы собираетесь выделить исключение, если байты неподходящие...
РЕДАКТИРОВАТЬ:Обратите внимание, что ваш код не допускает отрицательных чисел.Все хорошо?