有效数字String上的NumberFormatException

Dra*_*ken 18 java string encryption base64 android

我已经看到了一些其他问题,但错误与字符串中的前导0有关.不幸的是,这不是我的情况.

我从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)
Run Code Online (Sandbox Code Playgroud)

要检查输入我使用的打印,它实际上是字符串"2551122".当我尝试检查相等性时,它也是不正确的

"2551122".equals(numberAsString) // Gives me false
Run Code Online (Sandbox Code Playgroud)

我认为这是一个编码问题,并试图采用解码的字节并在几个编码中创建字符串,也试图用相同的几个编码解码base64字符串中的字节,但仍然不知道是什么导致了这个错误.

请任何帮助表示赞赏

UPDATE

这是用于解密字符串的代码(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);
}
Run Code Online (Sandbox Code Playgroud)

这是引发错误的方式:

Encryptor encryptor = new Encryptor();
Long.parseLong(encryptor.decrypt(base64String, secretKey)) // Throws me the error
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 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();
}
Run Code Online (Sandbox Code Playgroud)

编辑:似乎明文以BOM(字节顺序标记)开头,这是一个不可见的字符.

  • 这是你的问题.在字符串的开头有一个额外的不可见字符:http://www.fileformat.info/info/unicode/char/feff/index.htm.这是一个字节顺序标记(http://en.wikipedia.org/wiki/Byte_order_mark) (3认同)