2012-07-06 6 views
17

Widziałem kilka innych pytań na ten temat, ale błędy były związane z wiodącym 0 w ciągu znaków. To niestety nie jest moja sprawa.NumberFormatException na prawidłowym numerze String

Otrzymuję zaszyfrowane dane z zewnętrznego źródła w formacie base64, następnie je odkodowuję (przy użyciu dołączonej biblioteki Base64, ponieważ wersja Androida sdk to 7), odszyfruję wiadomość, a po wszystkim mam prosty ciąg znaków format liczbowy.

Kiedy próbuję oddanych do Long lub Integer otrzymuję ten błąd:

java.lang.NumberFormatException: Invalid long: "2551122" 
    at java.lang.Long.invalidLong(Long.java:125) 
    at java.lang.Long.parse(Long.java:362) 
    at java.lang.Long.parseLong(Long.java:353) 
    at java.lang.Long.parseLong(Long.java:319) 
    at com.nzn.lol.LoginActivity$LoginTask.doInBackground(LoginActivity.java:98) 
    at com.nzn.lol.LoginActivity$LoginTask.doInBackground(LoginActivity.java:1) 
    at android.os.AsyncTask$2.call(AsyncTask.java:264) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 

Aby sprawdzić wejście użyłem wydruki i to naprawdę jest ciąg "2551122". Przy próbie sprawdzenia równości, to również nie jest poprawne

"2551122".equals(numberAsString) // Gives me false 

myślałem, że to kwestia kodowania i próbował biorąc zakodowane bajty i tworzenie napisów w kilku kodowań, próbował również dekodować bajtach od base64 ciąg z tymi samymi kilkoma kodowaniami i nadal nie mają pojęcia, co powoduje ten błąd.

Proszę Każda pomoc jest mile widziana

UPDATE

Jest to kod do odszyfrowania ciąg (klasa Encryptor):

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
    Cipher cipher = Cipher.getInstance(encryptionAlgorithim); 
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(iVector)); 
    byte[] decrypted = cipher.doFinal(encrypted); 
    return decrypted; 
} 

public String decrypt(String encryptedString, String key) { 

    byte[] keyBytes = key.getBytes(); 
    byte[] decoded = Base64.decode(encryptedString); // Decodes the string from base64 to byte[] 
    byte[] result = decrypt(keyBytes, decoded); 
    return new String(result); 
} 

ten sposób błąd jest podniesiona:

Encryptor encryptor = new Encryptor(); 
Long.parseLong(encryptor.decrypt(base64String, secretKey)) // Throws me the error 
+1

Czy możesz wysłać kod, pod który go przesyłasz? – javajavajava

+2

ciekawe pytanie, proszę zaksięguj również kod. – AAnkit

+2

Czy możesz wysłać swój kod? –

Odpowiedz

16

Przejrzysty t ext prawdopodobnie zawiera znaki, które wyglądają jak cyfry ASCII, ale nie są cyframi ASCII. Zobacz http://www.fileformat.info/info/unicode/category/Nd/list.htm dla listy cyfr, które nie są cyframi ASCII.

Aby potwierdzić, należy wykonać następującą metodę na rozszyfrowanej tekście i na twardych kodowane długo jak struny, i porównać wyniki:

public static String displayCharValues(String s) { 
    StringBuilder sb = new StringBuilder(); 
    for (char c : s.toCharArray()) { 
     sb.append((int) c).append(","); 
    } 
    return sb.toString(); 
} 

EDIT: wydaje się, że czysty tekst zaczyna się BOM (byte order mark), który jest niewidzialną postacią.

+1

Wyświetlany wynik to '65279,50,53,53,49,49,50,50,' – Draiken

+3

Oto twój problem. Masz dodatkową, niewidzialną postać na początku łańcucha: http://www.fileformat.info/info/unicode/char/feff/index.htm. Jest to znak porządku bajtowego (http://en.wikipedia.org/wiki/Byte_order_mark) –

+0

dziękuję bardzo – Draiken

0

Wyszukiwanie poprzedzających lub końcowych spacji, użyj funkcji przycinania() do ich obsługi.

Powiązane problemy