2016-07-15 3 views
0

저는 바이트 값을 기반으로 트래버스해야하는 바이트 배열을 가지고 있습니다. 아래는 이것을위한 나의 코드입니다.바이트와 16 진수를 비교하십시오

for (byte b:byteArray) 
    { 

     if(b>=(byte)0x00 && b<=(byte)0x1F) 
     { 
      //do something 
     } 
     else if(b>=(byte)0x20 && b <=(byte)0xFE) 
     { 
      //do something 
     } 
     else if(b ==(byte)0xFF) 
     { 
      //do something 
     } 
    } 

내 문제는 내 기대에 따라 바이트 비교가 발생하지 않습니다.

내 바이트 배열의 값이 {31, -117, 8, 0 , -1}이라고 가정하면 코드에서 해당 범위의 모든 음수 바이트 값을 감지 할 수 없습니다. 예를 들어. -117은 0x200xFE 사이 여야하지만 범위를 벗어나지는 않습니다.

바이트를 비교하기 위해 this answer을 추적했습니다. 나는 코드에서 무엇이 잘못되었는지 알 수 없다.

미리 감사드립니다.

+1

'(byte) 0xFE'는 실제로'-2'입니다. –

+2

바이트는 Java로 서명됩니다. 따라서 'b <= (byte) 0xFE'는 0xfe와 0xff의 두 값에만 해당됩니다. – EJP

+0

@EJP 다음 두 범위에서 가능한 모든 바이트를 처리하도록 논리를 변경해야합니다 : '0x00-0x1f' 및'0x20-0xFE '. 미안하지만 질문이 아주 기본적인 것이지만 알아 내지 못했습니다. – Exception

답변

2

관계는 Java에없는 부호없는 바이트에서만 의미가 있습니다.

이 시도 : 솔루션 -117에서

for (byte b:byteArray) 
{ 
    int ib = b & 0xFF;   // This scales up to integer so you have values 0-255 
    if(ib >=0x00 && ib<=0x1F) 
    { 
     //do something 
    } 
    else if(ib>=0x20 && ib <=0xFE) 
    { 
     //do something 
    } 
    else if(ib == 0xFF) 
    { 
     //do something 
    } 
    else 
    { 
     // log a bug! This should never happen! 
    } 
} 

은 0x20에보다 사실에 0x8B에, (10 진수 32), 그것은 제 2 경로 기준 b >= 0x20을 충족하지 않도록. 사실 값이> 32 < = -2이므로 도달 할 수없는 코드가 생성됩니다.

+0

감사합니다. 효과가있다. – Exception

1

Java의 바이트는 기본적으로 서명됩니다. 부호없는 바이트를 가지고 해결 방법은 데 비슷한입니다 : int num = (int) bite & 0xFF 작동 원리

이의이 byte b = -128를 가정하자,, NUM 지금 -128과 이진 표현이 같다

int num = (int)b;1000 0000으로이 표현된다 :

1111 1111 1111 1111 1111 1111 1000 0000 

이진수로 num & 0xFF을 비교할 수 있습니까?

1111 1111 1111 1111 1111 1111 1000 0000 
& 
0000 0000 0000 0000 0000 0000 1111 1111 

결과는 서명 된 값이 부호없는 값으로 변환됩니다 의미 128 인 0000 0000 0000 0000 0000 0000 1000 0000이다.

관련 문제