2012-01-02 5 views
1

데스크톱 서버에 라이센스 키가 생성되고 Android 기기에서 인증 코드가 실행되는 Android 앱용 라이센스 관리자를 만드는 동안 멈추었습니다. 데스크톱에서 실행될 때 인증 코드는 원하는 결과를 생성하지만 동일한 코드는 Android에서 다른 결과를 생성합니다.Oracle JRE 및 Dalvik JVM의 결과가 다릅니다

나는 문제를 디버그하여 결과가 찍히는 지점에 도달했습니다! 결과가 나오는 오라클 JDK에

byte[] bytes = {-88, 50, -29, 114, 51, 88, 38, -52, 114, 91, -23, -55, 124, 37, -90, -49, 36, -110, -67, -59, -33, -75, 85, -72, -109, 25, -54, 89, 6, 35, -50, -11, -87, -22, 33, -2, 55, -30, 75, -36, -40, -29, -103, 110, 46, -100, -68, 101, -105, 62, 53, -20, -20, -21, -118, -72, -27, 32, 59, 127, 15, -117, 6, 102}; 
System.out.println(new String(bytes, "UTF-8").hashCode()); 

-24892055 

수 있지만 안드로이드 전화에 결과가하기 :

-186036018 
여기

그 차이를 설명 할 수있는 코드입니다

도움이 될 것입니다.

+0

Google의 라이센스 확인 라이브러리를 사용하지 않는 이유는 무엇입니까? (http://developer.android.com/guide/publishing/licensing.html) – JesusFreke

답변

3

getBytes()를 호출하면 ecoding도 지정해야합니다. 그렇지 않으면 OS에서 기본 인코딩을 가져옵니다. showBytes(new String(bytes, "UTF-8").getBytes("UTF-8"));

+0

지금은 너무 어리 석다. P 감사합니다. 내 하루를 저장했습니다. –

+1

다른 문제가 발생했습니다 : 'byte [] bytes = {-88, 50, -29, 114, 51, 88, 38, -52, 114, 91, -23, -55,124,37, -90, -49, 36, -110 -67, -59, -33, -75, 85, -72, -109, 25, -54, 89, 6, 35, -50, -11, -87, -22, 33, -30, -75, -36, -40, -29, -103, 110, 46, -100, -68, 101, -105, 62, 53, -20, -20, 72, -27, 32, 59, 127, 15, -117, 6, 102}; 에서 System.out.println (새로운 문자열 (바이트, "UTF-8") 해시 코드().) 바탕 화면에' 출력 :'-24892055' 안드로이드에 :'-186036018' 것은 무슨 일을 할 수있다 이것? –

+2

원래 질문을 완전히 변경하는 대신 새로운 질문을 시작해야합니다. – superfell

2

Android와 Java가 조작 된 UTF-8을 처리하는 방법의 차이점입니다. 4 바이트 시퀀스 0xf5 0xa9 0xea 0x21이 주어지면 Android는 두 유니 코드 대체 문자 (0xfffd)를 반환합니다. 오라클의 클래스 라이브러리는 세 개의 유니 코드 대체 문자를 반환합니다.

다음은이 문제를 보여주는 간단한 예입니다.

byte[] bytes = { (byte) 0xf5, (byte) 0xa9, (byte) 0xea, (byte) 0x21 }; 
String decoded = new String(bytes, "UTF-8"); 
for (int i = 0; i < decoded.length(); i++) { 
    System.out.print(Integer.toHexString(decoded.charAt(i)) + " "); 
} 

오라클의 JVM은

fffd fffd 

가장 좋은

fffd fffd fffd 

안드로이드의 dalvikvm 인쇄

당신은 그들이 실제로 있다는 것을 알고하지 않는 UTF-8을 사용하여 디코딩 바이트 시퀀스를 방지하는 것입니다 인쇄 UTF- 8. Dalvik 팀에게이 불일치를 조사하여 조사했습니다 : Android bug 23831.

CharsetDecoder를 사용하는 경우 Android는 icu4c를 사용하여 변환을 수행합니다. 그것은 U + fffd U + fffd U + 0021를 반환하는데, 이것은 UTF-8 스펙을 읽었을 때 정확한 것으로 보입니다. 이후 버전에서는 Android의 String이 Android의 CharsetDecoder 2과 일치합니다.

+0

감사합니다. 정말 좋은 생각이야! –

관련 문제