2011-08-07 72 views
3

我有一个可以是2,3或4大小的字节数组。我需要将其转换为正确的整数值。我也需要做相反的操作,例如一个2,3或4个字符的整数到一个字节数组。将US-ASCII编码的字节转换为整数并返回

例如,原始十六进制字节为:54和49.解码的字符串US-ASCII值是61,所以,整数答案必须是61

我已经阅读计算器等所有的转换问题,我可以找到,但他们都给出了完全错误的答案,我不知道它是否可以编码?

如果我做new String(lne,"US-ASCII"),其中lne是我的字节数组,我得到正确的61.但是,当这样做((int)lne[0] << 8) | ((int)lne[1] & 0xFF),我得到了完全错误的答案。

这可能是一个愚蠢的错误,或者我完全不理解Java中的数字表示方案和编码/解码思想。

任何帮助,将不胜感激。

注意:我知道我只能将字符串解析为整数,但我想知道是否有方法使用快速操作,如移位和二进制算术来代替?

回答

3

您需要两个转换步骤。首先,将你的ascii字节转换为一个字符串。这就是new String(lne,"us-ascii")为你做的。 Then,将数字的字符串表示形式转换为实际数字。为此,您使用类似Integer.parseInt(theString)的东西 - 请记住处理NumberFormatException。

1

正如你所说,new String(lne,"US-ASCII")会给你正确的字符串。将字符串转换为整数,使用int myInt = Integer.parseInt(new String(lne,"US-ASCII"));

4

下面是关于如何使用像字节转换和数字算术运算速度快于加快这一个念头。假设你有当前代码:

byte[] token; // bytes representing a bunch of ascii numbers 
int n = Integer.parseInt(new String(token)); // current approach 

然后,你可以替换,而不是最后一行,并执行以下(假设没有负数,没有外国的langauge字符等):

int n = 0; 
for (byte b : token) 
    n = 10*n + (b-'0'); 

出的兴趣,这导致我在大量数据集上的速度大约提高了28%。我认为这是由于没有分配新String对象,然后将每个parseInt电话后垃圾他们。