2012-07-06 11 views
17

Ho visto alcune altre domande a riguardo ma gli errori erano relativi a uno 0 iniziale nella stringa. Questo purtroppo non è il mio caso.NumberFormatException sul numero valido Stringa

Ricevo dati crittografati da una fonte esterna in formato base64, quindi decodifico (utilizzando una libreria Base64 inclusa perché la versione di sdk di Android è 7), decrittografare il messaggio e, dopo tutto, ho una semplice stringa in un formato numerico.

Quando provo a lanciarlo a Long o Integer ottengo questo errore:

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) 

Per controllare l'ingresso ho usato stampe ed è davvero la stringa "2.551.122". Quando provo controllare l'uguaglianza, non è anche corretto

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

ho pensato che fosse un problema di codifica e provato a prendere i byte decodificati e creando stringhe in diverse codifiche, tentò anche di decodificare i byte dal base64 stringa con queste stesse diverse codifiche e non ha ancora idea di cosa stia causando questo errore.

Si prega di ogni aiuto è apprezzato

UPDATE

Questo è il codice per decifrare la stringa (classe 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); 
} 

Questo è come l'errore viene generato:

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

puoi pubblicare il codice in cui l'hai lanciato? – javajavajava

+2

domanda interessante, per favore inserisci anche il codice .. – AAnkit

+2

Potresti per favore postare il tuo codice? –

risposta

16

Il chiaro t ext probabilmente contiene caratteri che sembrano cifre ASCII, ma non sono cifre ASCII. Vedere http://www.fileformat.info/info/unicode/category/Nd/list.htm per un elenco di cifre che non sono cifre ASCII.

Per confermare che, eseguire il seguente metodo sul testo decifrato e sugli hard-coded lungo come stringa, e confrontare i risultati:

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

EDIT: sembra che il testo in chiaro inizia con una BOM (byte order mark) che è un personaggio invisibile.

+1

Il risultato visualizzato era '65279,50,53,53,49,49,50,50,' – Draiken

+3

Ecco il tuo problema. Hai un carattere aggiuntivo e invisibile all'inizio della stringa: http://www.fileformat.info/info/unicode/char/feff/index.htm. È un byte order mark (http://en.wikipedia.org/wiki/Byte_order_mark) –

+0

grazie mille – Draiken

0

Ricerca di spazi precedenti o finali, utilizzare il trim() per gestirli.

Problemi correlati