Java быстро Atoi с использованием байта [] - PullRequest
1 голос
/ 01 февраля 2012

Я работаю над приложением, которое должно читать и обрабатывать плоские файлы.Эти файлы не всегда используют согласованную кодировку для каждого поля в записи, поэтому было решено, что мы должны читать / записывать байты и избегать необходимого декодирования / кодирования, превращая их в строки.

ОднакоМногие из этих полей являются простыми целыми числами, и мне нужно проверить их (проверить, что они действительно целые и находятся в определенном диапазоне).Мне нужна функция, которая получает байт [] и превращает его в int.Я предполагаю, что все цифры простые ASCII.

Я знаю, что мог бы сделать это, сначала превратив байт [] в CharBuffer, расшифровав до ISO-8859-1 или UTF-8, а затем вызвав Integer.parseInt (), но это выглядит какнакладные расходы и производительность важны.

Итак, в основном мне нужен Java-эквивалент atoi ().Я бы предпочел функцию API (включая сторонние API).Кроме того, функция должна каким-то образом сообщать об ошибках.

Как примечание, у меня та же проблема с полями, представляющими дату / время (хотя они встречаются реже).Было бы здорово, если бы кто-нибудь упомянул какую-нибудь быструю C-подобную библиотеку для Java.

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Функция atoi из библиотеки C - невероятно скучный кусок кода: вы можете перевести его на Java за пять минут или меньше.Если вы не хотите писать свои собственные, вы можете использовать конструктор String(byte\[\] buf, int offset,int length), чтобы сделать строку Java в обход CharBuffer, и проанализировать ее для завершения преобразования.

1 голос
/ 01 февраля 2012

, хотя я не могу дать вам готовое решение Java, я хочу указать вам интересный (с) код для чтения: автор из qmail имеет небольшую функцию длябыстро разбирая беззнаковые long из байтового массива scan_ulong, вы можете найти множество воплощений этой функции по всей сети:

unsigned int scan_ulong(register const char *s,register unsigned long *u)
{
  register unsigned int pos = 0;
  register unsigned long result = 0;
  register unsigned long c;
  while ((c = (unsigned long) (unsigned char) (s[pos] - '0')) < 10) {
    result = result * 10 + c;
    ++pos;
  }
  *u = result;
  return pos;
}   

(взято отсюда: https://github.com/jordansissel/djbdnsplus/blob/master/scan_ulong.c)

этот код должен довольно плавно переводиться в Java.

...