2012-07-06 77 views
17

我已經看到了一些關於此的其他問題,但錯誤與字符串中的前導0有關。這不幸的是不是我的情況。有效數字上的NumberFormatException字符串字符串

我正在從base64格式的外部源接收加密數據,然後解碼它(使用包含的Base64庫,因爲android sdk版本爲7),解密消息,以及畢竟我有一個簡單的字符串數字格式。

當我嘗試將其轉換爲LongInteger我得到這個錯誤:

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) 

要檢查我用打印輸入,它確實是字符串「2551122」。 當我嘗試檢查平等,這也是不正確

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

我認爲這是一個編碼的問題,並試圖採取解碼的位元和幾個編碼創建的字符串,也試圖從以base64字節進行解碼字符串與這些相同的幾種編碼,仍然不知道是什麼導致此錯誤。

請任何幫助表示讚賞

UPDATE

這是解密字符串(加密器類)的代碼:

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

這是錯誤是如何提出:

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

你可以發佈你的代碼嗎? – javajavajava 2012-07-06 16:38:45

+2

有趣的問題,請張貼代碼.. – AAnkit 2012-07-06 16:39:54

+2

請問您可以發佈您的代碼? – 2012-07-06 16:41:56

回答

16

明確的t ext可能包含看起來像ASCII數字但不是ASCII數字的字符。請參閱http://www.fileformat.info/info/unicode/category/Nd/list.htm以獲取非ASCII數字的數字列表。

要確認,執行解密的文字下面的方法,並在硬編碼的長字符串,然後比較結果:

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

編輯:看來明文以BOM開始(byte order mark)這是一個不可見的角色。

+1

顯示結果爲'65279,50,53,53,49,49,50,50', – Draiken 2012-07-06 17:02:22

+3

這是您的問題。你在字符串的開頭有一個額外的不可見字符:http://www.fileformat.info/info/unicode/char/feff/index.htm。它是一個字節順序標記(http://en.wikipedia.org/wiki/Byte_order_mark) – 2012-07-06 17:05:00

+0

非常感謝你 – Draiken 2012-07-06 17:09:48

0

注意前面或後面的空格,使用trim()來處理它們。

相關問題