> Java > java지도 시간 > Java에서 서명된 바이트를 서명되지 않은 바이트로 올바르게 처리하려면 어떻게 해야 합니까?

Java에서 서명된 바이트를 서명되지 않은 바이트로 올바르게 처리하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2024-12-26 20:46:18
원래의
241명이 탐색했습니다.

How Can I Correctly Treat Signed Bytes as Unsigned in Java?

Java에서 서명된 바이트를 서명되지 않은 것으로 처리

문제 배경

Java에서는 서명된 바이트를 서명되지 않은 바이트로 변환하는 것이 어려울 수 있습니다. 부호 없는 바이트 유형을 지원합니다. 결과적으로 부호 있는 바이트 값을 그대로 수신하고 해석하면 데이터 무결성 문제가 발생할 수 있습니다.

시도 1: 비트 연산을 사용한 변환

이를 해결하기 위해 일반적인 솔루션에서는 비트 연산을 사용하는 것이 좋습니다.

public static int unsignedToBytes(byte a) {
    int b = a & 0xFF;
    return b;
}
로그인 후 복사

그러나 이 방법은 반환된 값을 바이트 유형에 다시 할당하면 여전히 데이터 왜곡으로 이어지는 부호 있는 해석.

해결책: 수동 다운캐스팅 및 해석

이 문제를 해결하는 열쇠는 Java의 기본 요소에 서명이 있지만 메모리에서의 표현은 서명되지 않는다는 점을 이해하는 데 있습니다. 다음은 명시적으로 다운캐스트하여 바이트를 부호 없는 값으로 해석하는 수정된 솔루션입니다.

int i = 200; // 0000 0000 0000 0000 0000 0000 1100 1000 (200)
byte b = (byte) i; // 1100 1000 (-56 by Java specification, 200 by convention)

/*
 * When b is cast back to int, sign extension leads to:
 * 1111 1111 1111 1111 1111 1111 1100 1000 (-56)
 *
 * However, we choose to interpret this as +200 instead.
 */
System.out.println(b); // "-56"

/*
 * To eliminate sign extension, we perform a bitwise AND with 0xFF:
 * 1111 1111 1111 1111 1111 1111 1100 1000 (the int)
 * &
 * 0000 0000 0000 0000 0000 0000 1111 1111 (0xFF)
 * =======================================
 * 0000 0000 0000 0000 0000 0000 1100 1000 (200)
 */
System.out.println(b & 0xFF); // "200"
로그인 후 복사

위의 예에서는 정수 i를 바이트 b로 다운캐스트하여 값이 음수로 해석됩니다. Java의 부호 있는 바이트 사양을 따릅니다. 그러나 b를 0xFF와 수동으로 비트 AND 연산하면 부호 확장을 효과적으로 지우고 올바른 부호 없는 값을 검색할 수 있습니다.

이 기술을 사용하면 Java에서 부호 없는 바이트 값을 원활하게 사용하여 정확한 데이터 처리를 보장하고 언어의 한계 내에서 해석합니다.

위 내용은 Java에서 서명된 바이트를 서명되지 않은 바이트로 올바르게 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿