使用 byte[] 的 Java 快速 atoi

Posted

技术标签:

【中文标题】使用 byte[] 的 Java 快速 atoi【英文标题】:Java fast atoi using byte[] 【发布时间】:2012-02-01 08:29:23 【问题描述】:

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

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

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

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

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

【问题讨论】:

你见过SO question吗? 我也会使用直接的 ByteBuffer 来避免复制到 byte[]。 【参考方案1】:

虽然我无法为您提供现成的 java 解决方案,但我想向您指出有趣的 (c) 代码供您阅读:qmail 的 author 有一个小函数可以快速解析字节数组中的无符号长整数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。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于使用 byte[] 的 Java 快速 atoi的主要内容,如果未能解决你的问题,请参考以下文章

java中byte是啥类型

mfc如何给combo box关联byte型变量

Java byte(short)溢出,口算方法

java 8. String to Integer(atoi).java

java 8. String to Integer(atoi).java

java 8. String to Integer(atoi).java