2012-07-06 14 views
17

Ich habe einige andere Fragen zu diesem Thema gesehen, aber die Fehler wurden zu einem führenden 0 in der Zeichenfolge verwendet. Dies ist leider nicht mein Fall.Number auf gültige Nummer String

Ich erhalte verschlüsselte Daten von einer externen Quelle im Base64-Format, ich entziffere sie dann (unter Verwendung einer mitgelieferten Base64-Bibliothek, da die Android-SDK-Version 7 ist), entschlüssle die Nachricht, und schließlich habe ich eine einfache Zeichenfolge ein Zahlenformat

Wenn ich versuche, es zu gieße Long oder Integer ich diesen Fehler:

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) 

die Eingabe zu überprüfen I Drucken verwendet und es ist wirklich die Zeichenfolge „2551122“. Wenn ich auf Gleichheit zu überprüfen versuchen, es ist auch eine Codierung Problem und versucht, die entschlüsselten Bytes nehmen und die Schaffung von Zeichenketten in mehreren Codierungen, versuchte auch nicht richtig

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

Ich dachte, es war die Bytes aus dem base64 zu dekodieren Zeichenkette mit diesen gleichen mehreren Kodierungen und haben immer noch keine Ahnung von dem, was diesen Fehler verursacht.

Bitte jede Hilfe ist

geschätzt

UPDATE

Dies ist der Code zum Entschlüsseln der Zeichenfolge (Encryptor Klasse):

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

Dies ist, wie der Fehler ausgelöst wird:

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

können Sie nach dem Code, wo Sie es werfen? – javajavajava

+2

interessante Frage, bitte den Code auch posten .. – AAnkit

+2

Könnten Sie bitte Ihren Code posten? –

Antwort

16

Das klare t ext enthält wahrscheinlich Zeichen, die wie ASCII-Ziffern aussehen, aber keine ASCII-Ziffern sind. Eine Liste von Ziffern, die keine ASCII-Ziffern sind, finden Sie unter http://www.fileformat.info/info/unicode/category/Nd/list.htm.

Um das zu bestätigen, führen Sie das folgende Verfahren auf den Text entschlüsselt und auf den hartcodierte lange Zeichenfolge, und vergleichen Sie die Ergebnisse:

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

EDIT: es scheint, dass der Klartext mit einem BOM beginnt (byte order mark) ist ein unsichtbares Zeichen.

+1

Das angezeigte Ergebnis war '65279,50,53,53,49,49,50,50,' – Draiken

+3

Hier ist Ihr Problem. Sie haben ein zusätzliches, unsichtbares Zeichen am Anfang des Strings: http://www.fileformat.info/info/unicode/char/feff/index.htm. Es ist eine Byte Order Mark (http://en.wikipedia.org/wiki/Byte_order_mark) –

+0

vielen Dank – Draiken

0

Aussichtspunkt für vorhergehende oder nachfolgende Leerzeichen, verwenden trim(), um sie zu handhaben.