2014-01-20 2 views
0

아래의 행은 SHA1의 값을 가진 byte [] shaBytes 위치입니다. 처음 네 개는 while 루프에서 사용되는 숫자로 결과에 추가됩니다. 나는 몇 가지 반복 후 -2063597568과 같은 음수 값 아래의 라인 동안 자바로 objC 코드를 포팅하려고 해요. objC shaBytes에서바이트의 부정적인 결과

tVar > 0xFFFFFFFFL >> 11 

가 CC_SHA1의 파라미터로서 사용되는 서명 숯불 때

long tVar = (shaBytes[0] << 24) + (shaBytes[1] << 16) + (shaBytes[2] << 8) + (shaBytes[3] << 3); 

그래서 기본적 while 루프는 루프. objC에서 tVar가 음수가되기 때문에 코드는 700 번 이상 반복되지만 포트는 3 번만 반복됩니다.

답변

0

Java에 부호없는 바이트가 없습니다. 모든 Java 정수 유형이 서명됩니다. 이것은 부정적인 바이트의 좌측 이동이 음수가 될 것을 의미합니다 :

당신이 byte long에 변환 할 경우, 다른 한편으로
byte b = -30; 
long x = b << 24; 
System.out.printf("x = %d\n", x); 
// prints -503316480 

everything'll 괜찮 판명 :

byte b = -30; 
long x = (b & 0xffL) << 24; 
System.out.printf("x = %d\n", x); 
// prints 3791650816 

byte에 "서명을 변환하려면

long tVar = ((shaBytes[0] & 0xffL) << 24) + ((shaBytes[1] & 0xffL) << 16) + etc 

것은이 나 작동 것 "long 값 사용 (기억, 자바에는 부호없는 물건이 없다) Java long은 64 비트이며 부호가 있거나 부호없는 문제없이 8 비트 값의 24 left shift을 처리 할 수 ​​있습니다.

+0

이것은 효과가 있습니다. 이제 빌드중인 Java 코드가 objC와 동기화됩니다. 고맙습니다! – naz