2010-12-20 11 views
15

2 바이트 배열 (byte [2])을 java의 정수 값으로 변환해야합니다. 어떻게해야합니까?Java : 바이트를 정수로 변환합니다.

+5

이 질문은 몇 가지 설명을 사용할 수 있습니다. 지금 서 있기 때문에 어떤 대답을 선택했는지 알 수 있습니다. –

답변

24

이에 대한 ByteBuffer를 사용할 수 있습니다

ByteBuffer buffer = ByteBuffer.wrap(myArray); 
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian 
int result = buffer.getShort(); 

Convert 4 bytes to int를 참조하십시오.

+5

ByteBuffer 솔루션 용 +1 – Casey

+0

고맙습니다. ByteBuffer는 부호있는 바이트와 부호없는 바이트를 처리합니까? – keshav

+0

@keshav : 당신은 무엇을 의미합니까? "signed"또는 "unsigned"바이트는 없습니다. 바이트는 단지 '0'과 '1'의 그룹입니다. ** 오직 ** 의미는 당신이 그 숫자들을 해석하는 방법에 있습니다. –

3

글쎄, 각 바이트는 -128.1.127 범위의 정수이므로 한 쌍의 정수를 단일 정수로 매핑하는 방법이 필요합니다. 바이트 쌍으로 인코딩 한 내용에 따라 여러 가지 방법이 있습니다. 가장 일반적인 방법은 16 비트 부호있는 정수를 바이트 쌍으로 저장하는 것입니다. 바이트의 값이 음수가 될 수 있다는 뜻,

자바에서
(byte_array[1]<<8) + (byte_array[0] & 0xff) 
10

, 바이트가 서명 :

(byte_array[0]<<8) + (byte_array[1] & 0xff) 

또는 작은 엔디안 : 정수로 그것을 다시 변환하면 빅 엔디안 형태로 보관 여부에 따라 달라집니다 , 그렇게되면 @ MattBall의 독창적 인 해결책은 작동하지 않습니다. 바이트 어레이의 바이너리 형식이 같은 경우

예를 들어 :

1,000 1,101 1,000 1,101 다음에 myArray [0] 1000 1101이고 myArray의 [1] 1000 1101이며 1000 1101 바이트의 십진수 값 -115 대신 141 (= 2^7 + 2^3 + 2^2 + 2^0) 우리가 사용하는 경우

int result = (myArray[0] << 8) + myArray[1]

이 값은 -16191으로 잘못되었습니다.

의 잘못은 우리가 정수로 2 바이트의 배열을 해석 할 때, 모든 바이트가 서명되지 않은, 그래서 번역 할 때, 우리는 부호없는 정수에 서명 바이트지도를해야한다는 것입니다 이유 :

((myArray[0] & 0xff) << 8) + (myArray[1] & 0xff)

결과가 36237 인 경우 계산기 또는 ByteBuffer를 사용하여 올바른지 (예, 올바른지) 확인하십시오. 당신은 구아바 라이브러리를 사용할 수 있는지

+0

많은 설명을 주셔서 감사합니다 :) – shadygoneinsane

3

또한 :

Ints.fromByteArray(0, 0, myArray[1], myArray[0]); 

을이 프로젝트의 많은 어쨌든 그것을 사용하기 때문에 언급 할 가치가 있었다.

3

은 간단하게이 작업을 수행 :

return new BigInteger(byte[] yourByteArray).intValue(); 

등 부호 변환 대 서명에 대해 걱정할 필요가 없습니다 블루투스 명령 변환에 큰 작동합니다.

관련 문제