NumberFormatException для допустимой строки номера

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

Для проверки ввода я использовал отпечатки, и это действительно строка «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

person Draiken    schedule 06.07.2012    source источник
comment
Если вы можете контролировать внешний источник, попробуйте отправить номер без шифрования. Таким образом, вы можете точно знать, связано ли это с процессом шифрования/дешифрования.   -  person Benito Bertoli    schedule 06.07.2012
comment
Да, мы использовали это раньше без шифрования, это процесс шифрования/дешифрования. Я также проверил с помощью источника, что строка, которую он передал, действительно была той, которую я пытаюсь преобразовать.   -  person Draiken    schedule 06.07.2012
comment
Опубликованный вами метод расшифровки принимает два параметра String, но вызов дает только один. Я что-то упускаю?   -  person NominSim    schedule 06.07.2012
comment
@NominSim Просто опечатка, я не копирую / не вставляю точно, как это называется, для простоты. Починил это   -  person Draiken    schedule 06.07.2012
comment
Можете ли вы вывести последовательность базовых байтов, прежде чем преобразовать ее в строку, т. е. byte[] result = decrypt(keyBytes, decoded)? Это, вероятно, даст лучший ключ.   -  person mellamokb    schedule 06.07.2012
comment
@mellamokb есть ли эффективный метод для вывода байтов на выходе?   -  person Draiken    schedule 06.07.2012


Ответы (2)


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

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

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

РЕДАКТИРОВАТЬ: кажется, что открытый текст начинается со спецификации (метка порядка байтов), которая является невидимой персонаж.

person JB Nizet    schedule 06.07.2012
comment
Отображаемый результат: 65279,50,53,53,49,49,50,50, - person Draiken; 06.07.2012
comment
Вот твоя проблема. У вас есть дополнительный невидимый символ в начале строки: fileformat. info/info/unicode/char/feff/index.htm. Это знак порядка следования байтов (en.wikipedia.org/wiki/Byte_order_mark). - person JB Nizet; 06.07.2012
comment
Обратите внимание, что обработка спецификации Java иногда довольно ошибочна. Это позор, поскольку обработка юникода в целом довольно продвинута. - person Maarten Bodewes; 07.07.2012
comment
У меня есть \n в конце моей строки, и теперь я решил проблему, используя response = response.trim(); Благодарность - person Mohammed Subhi Sheikh Quroush; 01.08.2013

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

person Abhijeet    schedule 13.05.2015