바이트 배열을 숫자 값 (Java)으로 변환하는 방법은 무엇입니까?


89

8 바이트 배열이 있고 해당 배열을 해당 숫자 값으로 변환하고 싶습니다.

예 :

byte[] by = new byte[8];  // the byte array is stored in 'by'

// CONVERSION OPERATION
// return the numeric value

위의 변환 작업을 수행 할 방법을 원합니다.


4
"숫자 값"이란 무엇을 의미합니까? 바이트가 정수 (long) 또는 부동 소수점 숫자 (double)를 2 진수로 표시합니까? 숫자의 문자열 표현입니까? 아니면 또 다른 표현?
starblue


NB : TacB0sS의 링크는 제가 실제로 찾고 있던 순방향 및 역방향 변환이었습니다.
Jay Taylor

new BigInteger(by).longValue()
Marquis of Lorne 19

답변:


106

첫 번째 바이트가 최하위 바이트라고 가정합니다.

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value += ((long) by[i] & 0xffL) << (8 * i);
}

첫 번째 바이트가 가장 중요하지만 약간 다릅니다.

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value = (value << 8) + (by[i] & 0xff);
}

8 바이트 이상인 경우 long을 BigInteger바꾸십시오 .

오류를 수정 해준 Aaron Digulla에게 감사드립니다.


8
-1 바이트는 부호있는 값입니다! 그리고 pow ()를 shift (<<)로 바꾸십시오! "value = (value << 8) + (by [i] & 0xff)"
Aaron Digulla 2009-06-22

시프트 연산자 (<<)가 오른쪽에서 왼쪽으로 우선 순위가 있습니까? 위의 코드는 어떻게 작동합니까? 나를 위해 잘 작동합니다. 작동하는 것을 알고 싶습니다. 미리 고맙습니다
SURAJ

@Mnementh : 시프트 연산자 (<<)가 오른쪽에서 왼쪽으로 우선 순위가 있습니까? 위의 코드는 어떻게 작동합니까? 나를 위해 잘 작동합니다. 작동하는 것을 알고 싶습니다. Thanx 사전
suraj

5
다른 사람이 내가 한 것과 동일한 문제가있는 경우 첫 번째 예에서 by [i]를 long으로 캐스팅해야합니다. 그렇지 않으면 2 ^ 32보다 작은 값에 대해서만 작동합니다. 즉,value += ((long)by[i] & 0xffL) << (8 * i);
Luke

115

하나는 사용할 수 Buffer의 일부로 제공되는의 java.nio변환을 수행 할 수있는 패키지를.

여기서 소스 byte[]배열의 길이는 long값에 해당하는 크기 인 8 입니다.

먼저 byte[]배열을로 래핑 ByteBuffer한 다음 ByteBuffer.getLong메서드를 호출하여 long값 을 얻습니다 .

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();

System.out.println(l);

결과

4

ByteBuffer.getLong의견에 방법 을 지적 해 주신 dfa에게 감사드립니다 .


이 상황에서는 적용 할 수 없지만 Buffers 의 아름다움은 여러 값을 가진 배열을 보는 것과 함께 제공됩니다.

예를 들어, 우리는 8 바이트 배열을 가지고, 우리는 두 가지로 볼 원했던 int우리 랩 수 값 byte[]의 어레이 ByteBufferA와 볼, IntBuffer에 의해 값을 얻었다 IntBuffer.get:

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);

System.out.println(i0);
System.out.println(i1);

결과:

1
4

ByteBuffer.wrap (new byte [] {0, 0, 0, 1, 0, 0, 0, 4}). getLong ()은 어떻습니까? 이 메소드는 다음 8 바이트를 읽고 long으로 변환해야합니다.
dfa

@dfa : 지적 해 주셔서 감사합니다. 확실히 작동하는 것 같습니다. 답을 수정하겠습니다. :)
coobird 2009-06-22

16

8 바이트 숫자 값인 경우 다음을 시도 할 수 있습니다.

BigInteger n = new BigInteger(byteArray);

UTF-8 문자 버퍼 인 경우 다음을 시도 할 수 있습니다.

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));

이 답변이 첫 번째 코드 조각 바로 뒤에 끝나거나 문자열을 "숫자 값"으로 변환하는 코드가 포함되어 있다면이 답변에 투표했을 것입니다. 있는 그대로, 당신의 대답의 후반부는 평등하지 않은 것처럼 보입니다.
Laurence Gonsalves

내가 처음에 의미하지 무엇을, 나는 내 대답을 변경
빈센트 로버트


9

가변 길이 바이트에 BigInteger를 사용할 수도 있습니다. 필요에 따라 Long, Integer 또는 Short로 변환 할 수 있습니다.

new BigInteger(bytes).intValue();

또는 극성을 표시하려면 :

new BigInteger(1, bytes).intValue();


1

배열의 각 셀은 unsigned int로 처리됩니다.

private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
    return res;


for (int i=0;i<bytes.length;i++){
    res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}

제가 0xFFL을 사용해야한다는 점에 유의하세요.
Luke

0xFFL을 사용해야합니다. 그렇지 않으면 부호 확장을 얻습니다.
Gray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.