Java fast atoi使用byte []

时间:2012-02-01 08:29:23

标签: java performance ascii atoi

我正在开发一个应该读取和处理平面文件的应用程序。这些文件并不总是对记录中的每个字段使用一致的编码,因此我们决定读/写字节并避免必要的解码/编码将它们转换为字符串。

然而,很多这些字段都是简单的整数,我需要对它们进行验证(测试它们实际上是整数并且在一定范围内)。我需要一个接收byte []并将其转换为int的函数。我假设所有数字都是纯ASCII。

我知道我可以通过首先将byte []转换为CharBuffer,解码为ISO-8859-1或UTF-8,然后调用Integer.parseInt()来实现这一点,但这似乎是很多开销和性能很重要。

所以,基本上我需要的是一个与atoi()相当的Java。我更喜欢API函数(包括第三方API)。此外,该功能应以某种方式报告错误。

作为旁注,我对表示日期/时间的字段存在同样的问题(尽管这些字段更为罕见)。如果有人可以为Java提一些快速的C类库,那就太好了。

2 个答案:

答案 0 :(得分:1)

虽然我不能给你一个现成的java解决方案我想指出你有趣的(c)代码供你阅读:authorqmail有一个小函数来快速解析unsigned longs从字节数组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。

答案 1 :(得分:1)

C库中的atoi函数是一段令人难以置信的枯燥代码:您可以在五分钟或更短的时间内将其转换为Java。如果必须避免编写自己的编写器,可以使用String(byte\[\] buf, int offset,int length)构造函数使Java字符串绕过CharBuffer,并解析它以完成转换。