Ascii Bytes Array To Int32 или Double - PullRequest
1 голос
/ 26 марта 2010

Я переписываю alibrary с мандатом, чтобы сделать его полностью свободным. Цель состоит в том, чтобы после завершения запуска приложения было 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 #, которая уже делает это более оптимальным способом? Или улучшение, позволяющее ускорить выполнение описанного выше (вероятно, его будут вызывать миллионы раз в течение дня). Спасибо!

1 Ответ

5 голосов
/ 26 марта 2010

Миллионы раз в день не должны быть проблемой - я ожидаю, что он сможет работать сотни тысяч раз в секунду. Лично я переписал бы вышеупомянутое, чтобы объявить «temp» только внутри цикла (и избавиться от имен локальных переменных в Pascal-случаях - urgh), но это должно быть хорошо.

Код будет более понятен как:

int digit = bytes[i] - '0';

, который делает то же самое, что и ваш

Temp = ((Int32)bytes[i]) - 48;

строка, но более простым способом (ИМО). Они должны вести себя точно так же.

В общем, попытка написать C # без каких-либо выделений довольно жесткая и противоречит тому, как спроектированы язык и фреймворк. Вы верите, что это на самом деле разумное требование? Правда, я слышал о том, как некоторые игры пишутся в управляемом коде ... но это кажется немного странным.

Конечно, вы собираетесь выделить исключение, если байты неуместны ...

РЕДАКТИРОВАТЬ: обратите внимание, что ваш код не допускает отрицательных чисел. Это нормально?

...