使用 byte[] 的 Java 快速 atoi

标签 java performance ascii atoi

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

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

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

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

顺便说一句,我在表示日期/时间的字段上遇到了同样的问题(不过这种情况比较罕见)。如果有人能提到一些用于 Java 的快速类 C 库,那就太好了。

最佳答案

虽然我无法为您提供现成的 Java 解决方案,但我想向您指出有趣的 (c) 代码供您阅读:authorqmail有一个小函数可以从字节数组 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。

关于使用 byte[] 的 Java 快速 atoi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9092842/

相关文章:

java - 从 Java 在终端中显示西装符号

javascript - 优化将 JSON 属性名称小写的 JavaScript 代码

javascript - 在 for-in 循环的内部或外部声明变量

android - 如何使用 sencha touch 和 phoneGap 内置的 Google Map 提高应用程序的性能?

java - 如何删除所有扩展 ASCII 字符,但不删除变音符号?

mysql - 如何在不保存以检查是否与外部 ASCII 字符串匹配的情况下即时将列转换为 ASCII?

java - Quartz调度器不工作

java - Maven 文件路径参数 exec

java - 这段代码会输出相同的结果吗?

java - 在android中使用Theme.Light设置ImageButton的背景透明