2012-07-06 3 views
17

나는 이것에 관해 다른 질문을 보았지만 오류는 문자열의 앞에 오는 0과 관련되어있었습니다. 이것은 불행히도 내 경우가 아닙니다.NumberFormatException 유효한 숫자 문자열

외부 소스에서 암호화 된 데이터를 base64 형식으로 수신하고 있습니다 (Android SDK 버전이 7이기 때문에 포함 된 Base64 라이브러리를 사용하여 디코딩). 메시지의 암호를 해독하고 이후에는 간단한 문자열이 있습니다. 숫자 형식.

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"입니다 :

은 내가이 오류가 Long 또는 Integer에 캐스팅 할 때. 내가 어떤지를 확인하려고 할 때 , 그것은 또한 내가 그것을 인코딩 문제라고 생각하고, 디코딩 된 바이트를 복용하고 여러 인코딩에서 문자열을 만드는 시도

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

정확하지 않습니다, 또한 64 기수에서 바이트를 디코딩하는 시도 문자열이 여러 개의 동일한 인코딩을 사용하지만이 오류의 원인을 파악할 수 없습니다.

은 어떤 도움이

UPDATE을 감사하십시오

이 (암호 화기 클래스) 문자열을 해독 코드입니다 :

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 
+1

캐스트 할 수있는 코드를 게시 할 수 있습니까? – javajavajava

+2

흥미로운 질문입니다. 코드도 게시하십시오 .. – AAnkit

+2

코드를 올리시겠습니까? –

답변

16

맑은 날 ext에는 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(); 
} 

편집 : 일반 텍스트는 BOM으로 시작 나타납니다 (byte order mark) 보이지 않는 문자입니다.

+1

표시된 결과는'65279,50535349495050, ' – Draiken

+3

입니다. 여기에 문제가 있습니다. 문자열의 시작 부분에 보이지 않는 추가 문자가 있습니다. http://www.fileformat.info/info/unicode/char/feff/index.htm. byte order mark (http://en.wikipedia.org/wiki/Byte_order_mark) –

+0

고맙습니다. – Draiken

0

앞이나 뒤 공백이 있는지 살펴 보려면 trim()을 사용하십시오.