java - forinputstring - NumberFormatException en una cadena de número válida
java lang numberformatexception for string (2)
He visto algunas otras preguntas sobre esto, pero los errores estaban relacionados con un 0 inicial en la cadena. Lamentablemente este no es mi caso.
Recibo datos encriptados de una fuente externa en formato base64, luego los decodifico (usando una biblioteca Base64 incluida porque la versión de Android sdk es 7), descifro el mensaje y, después de todo, tengo una cadena simple en formato numérico.
Cuando intento convertirlo en Long
o Integer
me sale 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 verificar la entrada, usé copias y realmente es la cadena "2551122". Cuando trato de verificar la igualdad, tampoco es correcto
"2551122".equals(numberAsString) // Gives me false
Pensé que era un problema de codificación y traté de tomar los bytes decodificados y crear cadenas en varias codificaciones, también intenté decodificar los bytes de la cadena base64 con estas mismas codificaciones y todavía no tengo idea de qué está causando este error.
Por favor, cualquier ayuda se agradece
ACTUALIZAR
Este es el código para descifrar la cadena (clase 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);
}
Así es como se plantea el error:
Encryptor encryptor = new Encryptor();
Long.parseLong(encryptor.decrypt(base64String, secretKey)) // Throws me the error
Busque los espacios anteriores o posteriores, utilice recortar () para manejarlos.
El texto claro probablemente contiene caracteres que parecen 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 eso, ejecute el siguiente método en el texto descifrado y en el código codificado, como una cadena, y compare 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();
}
EDITAR: parece que el texto claro comienza con una lista de materiales ( marca de orden de bytes ) que es un carácter invisible.