1

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

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

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

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

作为旁注,我在表示日期/时间的字段上遇到了同样的问题(虽然这些更罕见)。如果有人能提到一些用于 Java 的快速类 C 库,那就太好了。

4

2 回答 2

1

虽然我不能给你一个现成的 java 解决方案,但我想向你指出有趣的 (c) 代码供你阅读:qmail的作者有一个小函数可以快速解析字节数组中的无符号长整数,你可以找到很多化身该功能在整个网络上: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。

于 2012-02-01T08:43:50.707 回答
1

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

于 2012-02-01T08:51:21.047 回答