2012-02-01 57 views
1

我工作的那是應該讀取和處理平面文件的應用程序。這些文件並不總是對記錄中的每個字段使用一致的編碼,所以決定我們應該讀/寫字節,並避免將它們轉換爲字符串的必要的解碼/編碼。Java中使用快速的atoi的byte []

然而,許多這些領域的簡單整數,我需要驗證他們(測試它們都是整數,並在一定範圍內)。我需要一個接收一個byte []的函數,並將它變成一個int。我假設所有的數字都是純ASCII。

我知道我可以這樣做,首先將字節[]轉換爲CharBuffer,解碼爲ISO-8859-1或UTF-8,然後調用Integer.parseInt(),但是這看起來像是很多開銷,表現很重要。

所以,基本上我需要的是一個Java等價的atoi的()。我更喜歡API函數(包括第三方API)。此外,該功能應以某種方式報告錯誤。

作爲一個方面說明,我在與代表日期/時間字段相同的問題(這是較爲少見的,雖然)。如果有人能夠提到一些用於Java的快速C類庫,那將會很棒。

+0

你見過THI [SO問題](http://stackoverflow.com/questions/4950598/convert-byte-to-int)? – Grooveek 2012-02-01 08:39:30

+0

我會使用一個直接的ByteBuffer來避免複製到一個byte []。 – 2012-02-01 09:32:44

回答

1

雖然我不能給你一個現成的Java解決方案,我想你點到有趣的(C)的代碼,供您閱讀:中qmailauthor有一個小的功能,迅速從一個字節數組scan_ulong解析無符號多頭,你可以找到很多該函數的化身的所有網站上:

unsigned int scan_ulong(register const char *s,register unsigned long *u) 
{ 
    register unsigned int pos = 0; 
    register unsigned long result = 0; 
    register unsigned long c; 
    while ((c = (unsigned long) (unsigned char) (s[pos] - '0')) < 10) { 
    result = result * 10 + c; 
    ++pos; 
    } 
    *u = result; 
    return pos; 
} 

(從這裏取:https://github.com/jordansissel/djbdnsplus/blob/master/scan_ulong.c

代碼應該相當順利轉換成Java。