2012-07-06 55 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()来处理它们。

相关问题