문제

프로젝트 내에서 몇 줄의 코드가 있습니다.

buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80);

파일에서 파일 버퍼를 읽고 바이트로 저장 한 다음 표시된대로 [I]로 전송하지만 전체 목적이 무엇인지 이해할 수 없습니까?

감사

도움이 되었습니까?

해결책

다른 답변이 이미 언급했듯이 (currentByte & 0x7F) | (currentByte & 0x80) 동일합니다 (currentByte & 0xFF). JLS3 15.22.1 이것이 홍보된다고 말합니다 int:

운영자의 두 피연산자가 &, ^, 또는 | 전환 가능한 유형 (§5.1.8)은 원시 적분 유형으로, 이진 숫자 홍보는 첫 번째 피연산자에서 수행됩니다 (§5.6.2). 비트 타이어 운영자 표현식의 유형은 홍보 된 피연산자 유형입니다.

JLS3 5.6.2 언제 currentByte 유형이 있습니다 byte 그리고 0x7F 이다 int (그리고 이것은 사실입니다), 두 피연산자 모두 홍보됩니다. int.

그러므로, buffer 요소 유형의 배열이됩니다 int 또는 더 넓습니다.

이제 공연을 통해 & 0xFFint, 우리는 원본을 효과적으로 매핑합니다 byte 범위 -128..127 부호없는 범위 0..255, 자주 사용하는 작업입니다. java.io 예를 들어 스트림.

다음 코드 스 니펫에서이를 볼 수 있습니다. 여기서 무슨 일이 일어나고 있는지 이해하려면 Java가 적분 유형을 저장한다는 것을 알아야합니다. char, 처럼 2의 보완 가치.

byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));

마지막으로, 실제 예를 보려면 Javadoc 및 구현을 확인하십시오. read 의 방법 java.io.ByteArrayInputStream:

/**
 * Reads the next byte of data from this input stream. The value 
 * byte is returned as an <code>int</code> in the range 
 * <code>0</code> to <code>255</code>. If no byte is available 
 * because the end of the stream has been reached, the value 
 * <code>-1</code> is returned. 
 */
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}

다른 팁

 (currentByte & 0x7F) | (currentByte & 0x80)

동일합니다

 currentByte & (0x7F | 0x80)

그것은 동일합니다

 currentByte & 0xFF

정확히 동일합니다

 currentByte

편집 : 나는 과제의 오른쪽을 보았지만 여전히 동등성이 사실이라고 생각합니다.

그러나 코드가 서명되지 않은 것으로 해석하면서 서명 된 바이트를 더 큰 유형으로 캐스팅하려는 것 같습니다.

Java에 서명되지 않은 서명을 캐스트하는 더 쉬운 방법이 있습니까?

누군가가 여기서 너무 많은 생각을했다고 생각합니다. 그것은 옳지 않습니다.

나는 하나의 말만 가지고있다

  • 오리지널 저자는 바이트를 기본 서명 정수 (아마도 32 비트)로 대체하는 것에 대해 걱정했으며 표지판 비트가 "특별한"것에 대해 명시 적으로 말하려고 노력하고 있습니까?

남은 코드입니다. 당신이 비린내 런 타임에 있다는 것을 알고 있지 않다면? 어쨌든 '버퍼'의 유형은 무엇입니까?

복잡한 비트로 논리는 완전히 불필요합니다.

for (int i = 0; i < buffer.length; i++) {
    buffer[i] = filebuffer[currentPosition + i] & 0xff;
}

같은 일을합니다. 버퍼가 바이트 배열로 선언되면 & 0xff를 제거 할 수도 있지만 불행히도 선언은 표시되지 않습니다.

그 이유는 원래 개발자가 Java로 서명 된 바이트가 혼란 스러웠 기 때문일 수 있습니다.

비트와 작동의 결과는 두 비트가 모두 1 인 반면, 비트 또는 작동의 결과는 봇 비트 중 하나가 1 인 비트를 사용합니다.

따라서 값 0x65에 대한 예제 평가 :

  01100101 0x65
& 01111111 0x7F
===============
  01100101 0x65

  01100101 0x65
& 10000000 0x80
===============
  00000000 0x00

  01100101 0x65
| 00000000 0x00
===============
  01100101 0x65

이러한 종류의 논리적 작업에 대한 좋은 점 : 가능한 모든 조합 (256 개)을 시도하고 예상 한 답변을 얻는 것을 확인할 수 있습니다.

바이트가 읽은 파일은 서명 된 비트 표기법으로, 길이가 다른 파일이므로 올바른 부호를 유지하면서 Java Int 유형으로 확장 할 수 있도록이 작업을 수행하도록 요청했습니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top