Подтвердить что ты не робот

NumberFormatException для действительного числа String

Я видел некоторые другие вопросы об этом, но ошибки были связаны с ведущим 0 в строке. Это, к сожалению, не мое дело.

Я получаю зашифрованные данные из внешнего источника в формате base64, затем я его декодирую (используя встроенную библиотеку Base64, потому что версия sdk для android равна 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)

Чтобы проверить ввод, я использовал отпечатки, и это действительно строка "2551122". Когда я пытаюсь проверить равенство, это также неверно.

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

Я думал, что это проблема с кодировкой, и попытался взять декодированные байты и создать строки в нескольких кодировках, а также попытался декодировать байты из строки 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);
}

Так возникает ошибка:

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

Ответ 1

Ясный текст, вероятно, содержит символы, которые выглядят как цифры ASCII, но не являются цифрами ASCII. См. http://www.fileformat.info/info/unicode/category/Nd/list.htm для списка цифр, которые не являются цифрами ASCII.

Чтобы подтвердить это, выполните следующий метод в расшифрованном тексте и в строчной кодировке long string и сравните результаты:

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

EDIT: кажется, что чистый текст начинается с спецификации (байтового порядка), который является невидимым символом.

Ответ 2

Для поиска предшествующих или конечных пробелов используйте trim() для их обработки.