SHA1의 값이있는 byte [] shaBytes 아래에이 줄이 있습니다. 처음 4 개는 while 루프에서 사용되는 숫자에 더해집니다. objC 코드를 java로 이식하려고 시도하고 있는데 아래 줄은 여러 번 반복 한 후 -2063597568과 같은 음수 값이됩니다.
long tVar = (shaBytes[0] << 24) + (shaBytes[1] << 16) + (shaBytes[2] << 8) + (shaBytes[3] << 3);
따라서 기본적으로 while 루프는
tVar > 0xFFFFFFFFL >> 11
objC에서 shaBytes는 CC_SHA1에서 매개 변수로 사용되는 부호없는 문자입니다. objC에서 코드는 tVar가 음수가되기 때문에 내 포트가 3 번만 반복되는 동안 700 번 이상의 반복을 반복합니다.
Java에는 부호없는 바이트가 없습니다. 모든 Java 정수 유형이 서명됩니다. 이것은 음수 바이트의 왼쪽 시프트가 음수임을 의미합니다.
byte b = -30;
long x = b << 24;
System.out.printf("x = %d\n", x);
// prints -503316480
반면 byte
에 long
모든 것으로 변환 하면 괜찮습니다.
byte b = -30;
long x = (b & 0xffL) << 24;
System.out.printf("x = %d\n", x);
// prints 3791650816
byte
"unsigned"값으로 변환하려면 (Java에는 서명되지 않은 항목이 없음을 기억하십시오) 다음을 long
사용하십시오.
long tVar = ((shaBytes[0] & 0xffL) << 24) + ((shaBytes[1] & 0xffL) << 16) + etc
이는 Java long
가 64 비트이고 24 left shift
부호 / 부호없는 문제없이 8 비트 값을 처리 할 수 있기 때문에 작동 합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다