2013-03-06 45 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

相關問題