使用 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 8. String to Integer(atoi).java