모든 Java 바이트가 서명된다는 사실을 해결하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/11088

  •  08-06-2019
  •  | 
  •  

문제

Java에는 부호 없는 바이트라는 것이 없습니다.

일부 낮은 수준의 코드로 작업할 때 때때로 128보다 큰 부호 없는 값을 가진 바이트로 작업해야 할 때가 있습니다. 이 경우 MSB가 부호에 사용되기 때문에 Java가 해당 값을 음수로 해석하게 됩니다.

이 문제를 해결하는 좋은 방법은 무엇입니까?(Java를 사용하지 않는다고 말하는 것은 선택 사항이 아닙니다)

도움이 되었습니까?

해결책

배열에서 단일 값을 읽을 때 이를 short 또는 int와 같은 값으로 복사하고 음수를 양수 값으로 수동으로 변환합니다.

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

배열에 쓸 때 비슷한 변환을 수행할 수 있습니다.

다른 팁

이렇게 하면 실제로 if 문과 추가 내용을 없애는 것이 가능합니다.

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

이런 식으로 Java는 바이트를 음수로 해석하지 않고 정수의 부호 비트도 뒤집습니다.

int를 사용하는 것이 일반적으로 short를 사용하는 것보다 낫습니다. Java는 내부적으로 32비트 값을 사용하기 때문에(배열이 아닌 한 바이트의 경우에도) int를 사용하면 바이트 코드의 short 값으로/에서 불필요한 변환을 피할 수 있습니다.

아마도 가장 좋은 방법은 바이트보다는 정수를 사용하는 것입니다.바이트를 대체하기 위해 특수 객체를 생성해야 하는 오버헤드 없이 128보다 큰 숫자를 허용할 공간이 있습니다.

이것도 나보다 똑똑한 사람들이 제안한거다(모두)

비트 조작/부호 없는 바이트를 수행하는 가장 좋은 방법은 다음을 사용하는 것입니다. 정수에스.부호가 있음에도 불구하고 부호 없는 바이트로 처리할 여분의 비트(총 32개)가 많이 있습니다.또한 모든 수학 연산자는 더 작은 고정 정밀도 숫자를 다음으로 변환합니다. 정수.예:

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

이 때문에 정수를 고수하고 관심 있는 비트를 얻기 위해 마스크하는 것이 가장 좋습니다.예:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

다음은 Java 기본 유형에 대한 추가 정보입니다. http://mindprod.com/jgloss/primitive.html

마지막으로 중요한 점은 Java에는 부호 없는 고정 정밀도 숫자가 하나 있다는 것입니다.그것은 원어.

나는 이것이 매우 늦은 답변이라는 것을 알고 있지만 똑같은 일을 하려고 할 때 이 스레드를 발견했습니다.문제는 단순히 Java 바이트가 127보다 큰지 확인하는 것입니다.

간단한 해결책은 다음과 같습니다.

if((val & (byte)0x80) != 0) { ... }

실제 문제가 128보다 큰 경우 해당 if 문에 다른 조건을 추가하면 문제가 해결됩니다.

숏팬츠를 이용해서 보관하시면 될 것 같아요.그다지 효율적이지는 않지만 실제로 제가 본 엄청난 노력 외에는 유일한 옵션입니다.

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