2012-07-06 23 views
17

Bu konuyla ilgili başka sorular gördüm, ancak hatalar dizede baştaki 0 ​​ile ilişkiliydi. Bu maalesef benim durumum değil.Geçerli sayıdaki NumberFormatException Dize

Base64 biçiminde bir dış kaynaktan şifrelenmiş veri alıyorum, sonra da (android sdk sürümü 7 olduğu için bir Base64 kitaplığı kullanarak) kodunu çözün, iletinin şifresini çözüyorum ve tüm bunlardan sonra basit bir dizeye sahibim bir sayı biçimi.

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) 

Ben baskılar kullanılan girişi kontrol etmek ve gerçekten dize "2551122" dir:

Ben bu hatayı alıyorum Long veya Integer için döküm çalıştığınızda. Ben eşitlik için kontrol çalıştığınızda , o da bunun bir kodlama sorunu olduğunu düşündüm ve kodu çözülmüş bayt alma ve çeşitli kodlamalar dizeleri oluşturma çalıştı

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

doğru değil, aynı zamanda base64 gelen bayt kodunu çözmek için çalıştı Aynı birkaç kodlamaya sahip dize ve bu hatanın nedenini hala bilmiyoruz.

herhangi bir yardım

GÜNCELLEME takdir edin

Bu (Şifreleyici sınıfı) dizisini deşifre kodudur:

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); 
} 

Bu hata ortaya çıkar nasıl:

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

Yayınladığınız kodu postayla gönderebilir misiniz? – javajavajava

+2

ilginç bir soru, Lütfen kodu da yazınız .. – AAnkit

+2

Kodunuzu gönderebilir misiniz? –

cevap

16

Net t ext muhtemelen ASCII basamaklarına benzeyen karakterler içerir, ancak ASCII basamakları değildir. ASCII basamak olmayan basamakların bir listesi için bkz. http://www.fileformat.info/info/unicode/category/Nd/list.htm.

doğrulamak için deşifre metni üzerinde aşağıdaki yöntemi yürütmek ve sabit kodlanmış dize olarak uzun ve karşılaştırın sonuçları:

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

EDIT: açık metin BOM ile başlar görünür Görünmez bir karakter olan (byte order mark).

+1

Gösterilen sonuç: 65279,50,53,53,49,49,50,50, ' – Draiken

+3

İşte probleminiz. Dize başında ek, görünmez bir karakter var: http://www.fileformat.info/info/unicode/char/feff/index.htm. Bu bir baytlık sipariş işareti (http://en.wikipedia.org/wiki/Byte_order_mark) –

+0

çok teşekkür ederim – Draiken

0

Önceki veya sonraki boşluklara dikkat edin, bunları kullanmak için trim() öğesini kullanın.