使用字节[]的Java fast atoi

使用字节[]的Java fast atoi,java,performance,ascii,atoi,Java,Performance,Ascii,Atoi,我正在开发一个应用程序,它应该可以读取和处理平面文件。这些文件并不总是对记录中的每个字段使用一致的编码,因此决定我们应该读/写字节,避免必要的解码/编码,将它们转换为字符串 然而,这些字段中有很多是简单的整数,我需要验证它们(测试它们是否真的是整数并且在一定范围内)。我需要一个函数来接收字节[],并将其转换为int。我假设所有数字都是纯ASCII 我知道我可以这样做,首先将字节[]转换为CharBuffer,解码为ISO-8859-1或UTF-8,然后调用Integer.parseInt(),但

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

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

我知道我可以这样做,首先将字节[]转换为CharBuffer,解码为ISO-8859-1或UTF-8,然后调用Integer.parseInt(),但这似乎需要很大的开销,性能也很重要

所以,基本上我需要的是atoi()的Java等价物。我更喜欢API函数(包括第三方API)。此外,函数应该以某种方式报告错误


作为旁注,我对表示日期/时间的字段也有同样的问题(尽管这些字段比较少见)。如果有人能提到一些类似C的Java快速库,那就太好了。

虽然我不能给你一个现成的Java解决方案,但我想让你读一读有趣的(C)代码:of有一个小函数,可以快速解析字节数组中的无符号长字符,您可以在web上找到该功能的许多具体体现:

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;
}   
unsigned int scan_ulong(寄存器常量字符*s,寄存器unsigned long*u)
{
寄存器无符号整数pos=0;
寄存器无符号长结果=0;
寄存器无符号长c;
while((c=(无符号长)(无符号字符)(s[pos]-'0'))<10){
结果=结果*10+c;
++pos;
}
*u=结果;
返回pos;
}   
(摘自此处:)


这些代码应该可以非常顺利地翻译成java。

C库中的函数是一段极其枯燥的代码:您可以在五分钟或更短的时间内将其翻译成java。如果您必须避免编写自己的,那么可以使用构造函数使Java字符串绕过
CharBuffer
,并对其进行解析以完成转换。

您看到了吗?我将使用直接ByteBuffer来避免复制到byte[]中。