2013-03-06 28 views
6

我正在从磁盘读取大文件。该文件只包含数字,编码为普通的旧ASCII。目前,我正在读的块,然后做这样的事情:将字节[]字符串转换为其整数值的快速方法

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

换句话说,我转换为字符串,然后解析字符串为整数。我想知道是否有办法使用像移位和二进制算术这样的快速操作?

我怀疑这可以做得更快。例如,数字1,2,3的原始字节是49,50,51。任何想法的黑客?

+0

如何号码输入文件界定? – Perception 2013-03-06 01:56:41

+0

它是否有负整数? – kuriouscoder 2013-03-06 02:39:35

+0

@Perception:不用担心,我已经处理了删除。我尽可能快地分割出byte []块。 – Dave 2013-03-06 09:53:54

回答

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

哇,这很好:)取决于排序虽然。 – 2013-03-06 01:59:47

+0

如果您阅读了ascii字符流,订单已被处理,正确,或者我错过了某些东西? – jdb 2013-03-06 02:04:41

+0

这里没有endian问题。然而,有些文化会先写下最低的数字吗?用阿拉伯语说,我们看到像'عام2013هوعامجيد'这样的东西。我们知道阿拉伯语是从右向左书写的,所以这里的阿拉伯数字是先写入最低的数字?不知道。 – irreputable 2013-03-06 02:06:53

2

你不能完全用10进制数进行二进制运算,但你可以做十进制运算。假设高阶位是第一位的:

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

谢谢。十进制算术的好处。 – Dave 2013-03-06 10:27:13

0

尝试

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 
+0

这与我原来的方法基本相同。我不想额外创建新的字符串,然后将它们解析为整数。 – Dave 2013-03-06 10:28:45

相关问题