首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Byte到Number的高效解析

Byte到Number的高效解析
EN

Stack Overflow用户
提问于 2015-02-02 08:01:48
回答 1查看 219关注 0票数 3

与其将字节数组解析为ASCII字符串,然后将字符串转换为整数,不如直接将字节数组解析为整数应该更有效。

代码语言:javascript
复制
byte[] token = "24000".getBytes(Charset.forName("US-ASCII"));

以下代码可以做到这一点:

代码语言:javascript
复制
int n = 0;
for (byte b : token)
  n = 10*n + (b-'0');

相对于共同办法:

代码语言:javascript
复制
int n = Integer.parseInt(new String(token));

参考:戴夫的答案在这里,>>,Converting US-ASCII encoded byte to integer and back

有跳过字符串创建并直接进行结果的全面解决方案吗?

请停止标记由于以下问题而导致的问题:Convert a byte array to integer in java and vice versa 它处理非编码字节。 它没有回答我的问题。

EN

回答 1

Stack Overflow用户

发布于 2015-02-02 08:53:01

Java库似乎没有专门用于这项工作的工具,但它确实有足够的工具自己编写工具。

在我看来,如果您担心性能问题,因为将字节数组转换为In是代码中的一个瓶颈,那么我建议根据您提供的代码来编写您自己的解决方案。如果不是,那么就使用parseInt来提高可读性。

在任何情况下,如果Java有这样的工具,那么它将在幕后使用几乎相同的代码。这几乎就是Integer.parseInt()所做的事情(但它涵盖了其他基数、负数,而且更安全):

代码语言:javascript
复制
 public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */

        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28273314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档