我已经看到了其他一些问题,但错误与字符串中的前导0有关。不幸的是,这不是我的情况。
我从base64格式的外部源接收加密数据,然后我解码它(使用包含的Base64库,因为android sdk版本是7),解密消息,然后我在一个简单的字符串中数字格式。
当我尝试将其投放到Long
或Integer
时,我收到此错误:
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)
要检查输入,我使用了print,它实际上是字符串“2551122”。 当我尝试检查相等性时,它也是不正确的
"2551122".equals(numberAsString) // Gives me false
我认为这是一个编码问题,并试图获取解码后的字节并在几种编码中创建字符串,也尝试使用这些相同的几种编码解码base64字符串中的字节,但仍然不知道导致此错误的原因。
欢迎任何帮助
更新
这是用于解密字符串的代码(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);
}
这就是引发错误的方法:
Encryptor encryptor = new Encryptor();
Long.parseLong(encryptor.decrypt(base64String, secretKey)) // Throws me the error
答案 0 :(得分:17)
明文可能包含看起来像ASCII数字的字符,但不是ASCII数字。有关非ASCII数字的数字列表,请参阅http://www.fileformat.info/info/unicode/category/Nd/list.htm。
要确认这一点,请在解密文本和硬编码长字符串上执行以下方法,并比较结果:
public static String displayCharValues(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
sb.append((int) c).append(",");
}
return sb.toString();
}
编辑:明文以明细字符(byte order mark)开头,这是一个不可见的字符。
答案 1 :(得分:0)
查找前面或尾随空格,使用trim()来处理它们。