Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


NumberFormatException en número válido Cadena

He visto algunas otras preguntas acerca de esto, pero los errores estaban relacionados con un líder 0 en la cadena. Desafortunadamente, no es mi caso.

Estoy recibiendo datos cifrados de una fuente externa en formato de base64, entonces lo decodelo (usando una biblioteca Base64 incluida porque la versión android sdk es 7), descifrar el mensaje, y después de todo que tengo una cadena simple en un formato numérico.

Cuando intento lanzarlo 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 que usé impresiones 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 trató de decodificar los bytes de la cadena base64 con estas mismas codificaciones varias y aún no tienen idea de lo que está causando este error.

Por favor, cualquier ayuda es apreciada

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 genera el error:

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

  • Enfoque correcto de Android: ¿dónde se debe analizar la respuesta de JSON - en el subproceso de interfaz de usuario, o en otro?
  • Android HttpPost: cómo obtener el resultado
  • Añadir ActionBar a una preferenciaActividad
  • Pruebas de instrumentación Android con Mockito
  • ¿Hay una manera de generar getters y setters automáticamente en Eclipse?
  • Android Spinner - ¿Cómo hacer que la vista desplegable sea transparente?
  • ¿Cómo manejar tanto los resultados del cuadro de búsqueda rápida como las sugerencias recientes de búsqueda?
  • Java socket no lanzar excepciones en un socket muerto?
  • 2 Solutions collect form web for “NumberFormatException en número válido Cadena”

    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 que, ejecute el siguiente método en el texto descifrado y en el codificado duro como 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(); } 

    EDIT: parece que el texto claro comienza con una lista de materiales ( marca de orden de bytes ) que es un carácter invisible.

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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.