2013-03-06 9 views
6

Czytam duży plik z dysku. Ten plik zawiera tylko cyfry, zakodowane jako zwykły stary ASCII. W tej chwili czytam w kawałki, a następnie robi coś takiego:Szybki sposób konwertowania ciągu bajtów [] na wartość Integer

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

Innymi słowy, jestem konwersji na ciąg i następnie analizowania ciągu do Integer. Chciałbym wiedzieć, czy istnieje sposób na wykorzystanie szybkich operacji, takich jak zmiana arytmetyki binarnej?

Podejrzewam, że można to zrobić szybciej. Na przykład surowe bajty dla liczb 1,2,3 wynoszą 49 505 1. Jakieś pomysły na hacki?

+0

Jak są rozdzielane numery w pliku wejściowego? – Perception

+0

Czy ma jakieś ujemne liczby całkowite? – kuriouscoder

+0

@Perception: nie muszę się tym martwić, już poradziłem sobie z delimination. Rozdzielam fragmenty bajtów tak szybko, jak to możliwe. – Dave

Odpowiedz

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

Wow, to dobrze :) Zależy jednak od zamówienia. –

+0

Jeśli czytasz strumień znaków ASCII, kolejność jest już zajęta, prawda czy coś mi brakuje? – jdb

+0

Tu nie ma problemu z endianami. jednak czy w jakiejś kulturze napiszemy najpierw najniższą cyfrę? Powiedz po arabsku, widzimy rzeczy takie jak 'عام 2013 هو عام جيد'. Wiemy, że arabski zapisywany jest od prawej do lewej, więc tutaj numer arabski jest zapisywany najpierw jako najniższa cyfra? Brak pomysłu. – irreputable

2

Nie można zrobić arytmetyki binarnej dokładnie bazowych 10 numerów, ale można zrobić arytmetyki dziesiętnej. Zakładając, że wyższego rzędu cyfr na pierwszym miejscu:

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

Dzięki. Dobry punkt na dziesiętnej arytmetyki. – Dave

0

spróbować

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); 

wyjście

123 
+0

Jest to zasadniczo to samo, co moje oryginalne podejście. Nie chciałem dodatkowego narzutu na tworzenie nowych ciągów, a następnie analizowanie ich na ints. – Dave

Powiązane problemy