바이트 배열을 숫자 값 (Java)으로 변환하는 방법은 무엇입니까?
문제
8 바이트 배열이 있고 해당 숫자 값으로 변환하고 싶습니다.
예를 들어
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
위의 변환 작업을 수행하는 메소드를 원합니다.
해결책
첫 번째 바이트가 가장 중요한 바이트라고 가정합니다.
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);
}
오래 교체하십시오 Biginteger, 8 바이트 이상이있는 경우.
오류 수정에 대한 Aaron Digulla에게 감사드립니다.
다른 팁
하나는 사용할 수 있습니다 Buffer
S의 일부로 제공되는 S java.nio
변환을 수행하기위한 패키지.
여기, 출처 byte[]
배열은 길이 8을 가지고 있으며, 이는 크기입니다. long
값.
먼저 byte[]
배열은 a 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
DFA에 감사하고 싶습니다 ByteBuffer.getLong
주석의 방법.
이 상황에서는 적용 할 수 없지만 Buffer
s는 여러 값이있는 배열을보고 있습니다.
예를 들어, 8 바이트 배열이있는 경우 두 개로보고 싶었습니다. int
값, 우리는 랩을 할 수 있습니다 byte[]
AN의 배열 ByteBuffer
,, 이것은 a로 간주됩니다 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
이것이 8 바이트 숫자 값이라면 다음을 시도 할 수 있습니다.
BigInteger n = new BigInteger(byteArray);
이것이 UTF-8 문자 버퍼 인 경우 시도 할 수 있습니다.
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
간단히 말해서 사용하거나 참조 할 수 있습니다 구아바 Google이 제공하는 LIB는 Long과 Byte 배열 사이의 변환 방법을 제공합니다. 내 클라이언트 코드 :
long content = 212000607777l;
byte[] numberByte = Longs.toByteArray(content);
logger.info(Longs.fromByteArray(numberByte));
가변 길이 바이트에 BigInteger를 사용할 수도 있습니다. 당신은 그것을 길고 정수 또는 짧은 것으로 변환 할 수 있으며, 당신의 요구에 맞는 어느 쪽이든 갈 수 있습니다.
new BigInteger(bytes).intValue();
또는 극성을 나타내려면 :
new BigInteger(1, bytes).intValue();
배열의 모든 원시 유형에 대한 Java 변환기 코드를 완료합니다.http://www.daniweb.com/code/snippet216874.html
어레이의 각 셀은 서명되지 않은 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;
}