2012-07-06 12 views
17

He visto algunas otras preguntas sobre esto, pero los errores se relacionaron con un 0 principal en la cadena. Desafortunadamente este no es mi caso.NumberFormatException en el número válido String

Estoy recibiendo datos encriptados de una fuente externa en formato base64, luego los decodifico (usando una biblioteca Base64 incluida porque la versión sdk de Android es 7), descifro el mensaje, y después de todo eso tengo una cadena simple en un formato numérico.

cuando trato de echarlo a Long o Integer consigo este error:

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) 

Para comprobar la entrada Solía ​​impresiones y lo que realmente es la cadena "2551122". Cuando intento para comprobar la igualdad, sino que también no es correcta

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

pensé que era un problema de codificación y trató de tomar los bytes decodificados y la creación de cadenas en varias codificaciones, también trató de descifrar los bytes desde la base 64 cadena con estas mismas codificaciones varias y todavía no tienen idea de qué está causando este error.

Por favor, cualquier ayuda se agradece

ACTUALIZACIÓN

Este es el código para descifrar la cadena (clase cifrador):

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

Es así como se eleva el error:

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

¿Puedes publicar el código donde lo lances? – javajavajava

+2

pregunta interesante, por favor, publique el código también ... – AAnkit

+2

¿Podría publicar su código? –

Respuesta

16

The clear t Es probable que la extensión contenga caracteres que se parecen a los dígitos ASCII, pero no son dígitos ASCII. Consulte http://www.fileformat.info/info/unicode/category/Nd/list.htm para obtener una lista de dígitos que no son dígitos ASCII.

Para confirmar que, ejecute el siguiente método en el texto descifrado y en los no modificables siempre y cuando la secuencia, y comparar los resultados:

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

EDIT: parece que el texto no cifrado comienza con una lista de materiales (byte order mark) que es un personaje invisible.

+1

El resultado mostrado fue '65279,50,53,53,49,49,50,50, ' – Draiken

+3

Aquí tienes tu problema. Tiene un carácter adicional e invisible al principio de String: http://www.fileformat.info/info/unicode/char/feff/index.htm. Es una marca de orden de bytes (http://en.wikipedia.org/wiki/Byte_order_mark) –

+0

muchas gracias – Draiken

0

Busque los espacios anteriores o posteriores, use trim() para manejarlos.

Cuestiones relacionadas