【问题标题】:Fast way converting a byte array to corresponding Integer将字节数组转换为相应整数的快速方法
【发布时间】:2014-01-12 15:20:15
【问题描述】:

首先,这听起来像是这里的问题: How to convert a byte array to its numeric value (Java)?

但是我的字节数组的来源是一个字符串,像这样:

byte[] foo = new byte[8];
foo = "12345678".getBytes();

有没有比
Integer.parseInt(new String(foo)) 更快的方法(是的,确实是这样快)? 字符串只包含代表整数的数字。

【问题讨论】:

  • 您是否分析了您的代码并证明这是一个实际的(而不是感知的)瓶颈?
  • 保留字符串引用,并将 Integer.parseInt 应用到它,将保存几个数组副本。
  • 不清楚你为什么使用字节数组而不是Integer.parseInt(originalString)...顺便说一句new byte[8]创建了一个立即丢弃的数组...
  • 我使用的是字节数组,因为数据是通过 RandomAccessFile 使用 read() 接收的。

标签: java string integer bytearray


【解决方案1】:

试试这个

    int res = 0;
    for(int i = foo.length -1, m = 1; i >=0; i--, m *= 10) {
        res += (foo[i] & 0xF) * m; 
    }

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    byte foo[] = "12345678".getBytes();
    //Since it is an 'integer' essentially, it will contain ASCII values of decimal digits.
    long num = 0;  //Store number here.
    for(int i = foo.length - 1; i >= 0; i--)
    {
        num = num * 10 + (foo[i] - '0'); // or (foo[i] - 48) or (foo[i] & 0xf)
    }
    

    num 存储所需的号码。

    注意事项:确保只使用十进制数。


    编辑:

    机制

    在调用String"12345678"中的getBytes()时,返回的byte[]如下:

    我们看到的值是等效字符的 ASCIIUnicode 值。 有几种方法可以将它们的等效字符提取为ints:

    1. 由于数字chars的排列,即'0'、'1'、'2'等是按所需的顺序进行的-升序和顺序,我们可以通过减去来提取字符'0' 的 ASCII 值,即 48。
    2. @Evgeniy Dorofeev 正确指出了屏蔽的方法:

    '0' => 48 => 11 0000

    我们注意到,如果我们提取最后 4 位,我们会得到所需的int。 为此,我们需要通过以下方式提取它们。 让我们取foo[1],即50

      50      & 0xf  (original)
    = 50      & 15   (in Decimal)
    = 11 0010 & 1111 (in Binary)
    = 0010           (result)
    = 2              (Decimal)
    

    因此,获得所需的数字。必须以正确的方式将add num int (我希望每个程序员都对此有所了解)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多