Java 将字节[]字符串转换为整数值的快速方法

Java 将字节[]字符串转换为整数值的快速方法,java,optimization,Java,Optimization,我正在从磁盘读取一个大文件。该文件只包含编码为普通旧ASCII的数字。目前,我正在分块阅读,然后做如下工作: byte[] token; // bytes representing a bunch of numbers int n = Integer.parseInt(new String(token)); 换句话说,我将转换为字符串,然后将字符串解析为整数。我想知道是否有一种方法可以使用像移位和二进制算术这样的快速运算来代替 我怀疑这可以更快。例如,数字1、2、3的原始字节为49、50、5

我正在从磁盘读取一个大文件。该文件只包含编码为普通旧ASCII的数字。目前,我正在分块阅读,然后做如下工作:

byte[] token;  // bytes representing a bunch of numbers
int n = Integer.parseInt(new String(token));
换句话说,我将转换为字符串,然后将字符串解析为整数。我想知道是否有一种方法可以使用像移位和二进制算术这样的快速运算来代替


我怀疑这可以更快。例如,数字1、2、3的原始字节为49、50、51。有什么好主意吗?

你不能精确地用以10为基数的数字做二进制算术,但你可以做十进制算术。假设高阶数字排在第一位:

    int n=0;
    for(byte b : token)
        n = 10*n + (b-'0');
byte[] token;
long n = 0;
long pow = 1;
for( int i = token.length - 1; i >= 0; i-- ) {
  n += (token[i]-48) * pow;
  pow *= 10;
}
试一试


输入文件中的数字是如何分隔的?它有负整数吗?@Perception:不用担心,我已经处理过了。我正在尽可能快地拆分字节[]块。@kuriouscoder:问得好,没有否定。如果你读取了一个ascii字符流,顺序已经处理好了,对吧,或者我遗漏了什么?这里没有endian问题。然而,一些文化会先写最低的数字吗?比如说在阿拉伯语中,我们会看到类似于2013年的代码。我们知道阿拉伯语是从右向左写的,所以这里的阿拉伯数字是先用最低的数字写的?不知道。这看起来很有希望!顺序不是问题,它是从左到右的。而且,不用担心外语技巧。我会测试一下,让你知道:)谢谢!有趣的是,这导致了大约28%的加速。如何将其转换回字符串到字节数组?这与我最初的方法基本相同。我不想要额外的开销,创建新字符串,然后将它们解析为int。
    byte[] a = { 1, 2, 3 };
    for (int i = 0; i < a.length; i++) {
        a[i] += '0';
    }
    int n = Integer.parseInt(new String(a));
    System.out.println(n);
123