Java 정수 대 바이트 배열


191

나는 정수를 얻었다 : 1695609641

내가 방법을 사용할 때 :

String hex = Integer.toHexString(1695609641);
system.out.println(hex); 

제공합니다 :

6510f329

하지만 바이트 배열을 원합니다.

byte[] bytearray = new byte[] { (byte) 0x65, (byte)0x10, (byte)0xf3, (byte)0x29};

어떻게 만들 수 있습니까?



답변:


294

Java NIO의 ByteBuffer를 사용하는 것은 매우 간단합니다.

byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array();

for (byte b : bytes) {
   System.out.format("0x%x ", b);
}

산출:

0x65 0x10 0xf3 0x29 

4
또는 "0x%02X"항상 두 개의 16 진수 문자와 대문자 16 진수를 원할 경우 형식을 사용하십시오 ( 예 : System.out.format("0x%02X", (byte) 10)displays) 0x0A.
Maarten Bodewes

12
Integer.SIZE / 8을 사용하여 4와 같은 하드 코딩을 피할 수 있습니다. 이는 Long과 같은 다른 유형에 잘 작동하는 패턴입니다.
davenpcj

3
@davenpcj 당신은 Integer.SIZE / Byte.SIZE 사용할 수 있습니다
rkosegi

11
: 자바 8 이후 @rkosegi 심지어 Integer.BYTES
drvdijk

1
@MaartenBodewes 스레드는 눈에 띄는 형식은 없지만 기본 유형 작업
Jacek Cz

146

어때요?

public static final byte[] intToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 24),
            (byte)(value >>> 16),
            (byte)(value >>> 8),
            (byte)value};
}

아이디어는 것이 아니다 . 나는에서 촬영했습니다 dzone.com에 대한 몇 가지 게시물 .


44
요점을 알지만이 특정 작업의 경우 '내'코드는 어떤 '매직'ByteBuffer보다 선언적이고 명확합니다.
Grzegorz Oledzki

24
@Kevin-매우 가혹합니다. 예를 들어 이미지 처리와 같은 이러한 종류의 코드가 적절한 경우가 많이 있습니다. JDK 라이브러리는 일반적으로 훌륭하지만 모든 사용 사례에 대해 다루거나 최적화하지는 않습니다.
mikera

14
동의했다. ByteBuffer의 오버 헤드와 복잡성은 단순하고 잘 알려진 바이트 연산과 비교하여 적절하지 않을 수 있습니다.
swdunlop

6
내가 추가 할 또 다른 요점 >>>은 오른쪽 시프트 연산자 >>( docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html ) 대신 부호없는 오른쪽 시프트 연산자를 사용 했기 때문에 동작이 원하는대로 /되지 않을 수 있습니다 부호있는 숫자와 부호없는 숫자로 예상되는 것처럼
RobV

4
이 방법은 언급 된 ByteBuffer 또는 BigInteger 메소드보다 빠르다. 많은 전환을 수행 할 경우 고려해야 할 사항이 있습니다.
Seeker

45

BigInteger.valueOf(1695609641).toByteArray()


2
4 바이트 배열을 생성한다는 보장은 무엇입니까?
MeBigFatGuy

2
정확하게 MeBigFatGuy가 쓴 것. BigInteger.toByteArray()상태의 Javadoc : "배열에는이 BigInteger를 나타내는 데 필요한 최소 바이트 수가 포함됩니다 ..."
icza

2
질문에서 바이트 배열이 고정 길이 4가되도록 요청하는 위치는 무엇입니까? 알고리즘에 따라 이것은 배열의 길이를 활용할 수있는 부분입니다
vmpn

이것은 훨씬 더 역동적이고 정답이어야합니다. 원하는 경우 배열 추가를 수행하여 원하는 크기를 만들 수 있습니다. 특히 Java signed int 값을 고려해야 할 때.
Droid Chris

2
이것은 0x7f에 1 바이트를, 0x80에 2 바이트를 만드는 것으로 보입니다 (두 바이트는 0x0 0x80).
Scot

26
byte[] IntToByteArray( int data ) {    
    byte[] result = new byte[4];
    result[0] = (byte) ((data & 0xFF000000) >> 24);
    result[1] = (byte) ((data & 0x00FF0000) >> 16);
    result[2] = (byte) ((data & 0x0000FF00) >> 8);
    result[3] = (byte) ((data & 0x000000FF) >> 0);
    return result;        
}


7
byte[] conv = new byte[4];
conv[3] = (byte) input & 0xff;
input >>= 8;
conv[2] = (byte) input & 0xff;
input >>= 8;
conv[1] = (byte) input & 0xff;
input >>= 8;
conv[0] = (byte) input;

2
가장 중요한 8 바이트를 추출합니다. 또한 입력 숫자의 부호를 변환 된 옥텟으로 드래그하지 않아도됩니다.
Carl Smotricz 2014 년

stackoverflow.com/questions/35305634/…- 이 C #을 Java로 해결할 수 있습니까?

5
public static byte[] intToBytes(int x) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(bos);
    out.writeInt(x);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}

4

아래 청크는 적어도 UDP를 통해 int를 보내기 위해 작동합니다.

정수에서 바이트 배열 :

public byte[] intToBytes(int my_int) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = new ObjectOutputStream(bos);
    out.writeInt(my_int);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}

바이트 배열 int :

public int bytesToInt(byte[] int_bytes) throws IOException {
    ByteArrayInputStream bis = new ByteArrayInputStream(int_bytes);
    ObjectInputStream ois = new ObjectInputStream(bis);
    int my_int = ois.readInt();
    ois.close();
    return my_int;
}

4
ObjectOutputStream 사용이 올바르지 않습니다. DataOutputStream을 사용하십시오. OOS를 사용하면 바이트 배열이 4 바이트가 아닙니다.
MeBigFatGuy

2

일반적으로 나중에이 배열을 int로 다시 변환하려고하므로 int 배열을 바이트 배열로 변환하거나 그 반대로 변환하는 방법은 다음과 같습니다.

public static byte[] convertToByteArray(final int[] pIntArray)
{
    final byte[] array = new byte[pIntArray.length * 4];
    for (int j = 0; j < pIntArray.length; j++)
    {
        final int c = pIntArray[j];
        array[j * 4] = (byte)((c & 0xFF000000) >> 24);
        array[j * 4 + 1] = (byte)((c & 0xFF0000) >> 16);
        array[j * 4 + 2] = (byte)((c & 0xFF00) >> 8);
        array[j * 4 + 3] = (byte)(c & 0xFF);
    }
    return array;
}

public static int[] convertToIntArray(final byte[] pByteArray)
{
    final int[] array = new int[pByteArray.length / 4];
    for (int i = 0; i < array.length; i++)
        array[i] = (((int)(pByteArray[i * 4]) << 24) & 0xFF000000) |
                (((int)(pByteArray[i * 4 + 1]) << 16) & 0xFF0000) |
                (((int)(pByteArray[i * 4 + 2]) << 8) & 0xFF00) |
                ((int)(pByteArray[i * 4 + 3]) & 0xFF);
    return array;
}

부호 전파 등으로 인해 int로 다시 변환 할 때 "& 0xFF ..."가 필요합니다.


1
integer & 0xFF

첫 번째 바이트

(integer >> 8) & 0xFF

두 번째 및 루프 등의 경우 미리 할당 된 바이트 배열에 씁니다. 불행히도 조금 지저분합니다.


1

org.apache.hadoop.hbase.util.Bytes 클래스에는 편리한 byte [] 변환 메소드가 많이 있지만이 목적으로 만 전체 HBase jar을 프로젝트에 추가하지 않을 수 있습니다. 그러한 메소드가 JDK에서 AFAIK를 누락했을뿐만 아니라 commons io와 같은 명백한 라이브러리에서도 누락 된 것은 놀라운 일입니다.


1

내 시도 :

public static byte[] toBytes(final int intVal, final int... intArray) {
    if (intArray == null || (intArray.length == 0)) {
        return ByteBuffer.allocate(4).putInt(intVal).array();
    } else {
        final ByteBuffer bb = ByteBuffer.allocate(4 + (intArray.length * 4)).putInt(intVal);
        for (final int val : intArray) {
            bb.putInt(val);
        }
        return bb.array();
    }
}

그것으로 당신은 이것을 할 수 있습니다 :

byte[] fourBytes = toBytes(0x01020304);
byte[] eightBytes = toBytes(0x01020304, 0x05060708);

전체 클래스는 다음과 같습니다 : https://gist.github.com/superbob/6548493 , 반바지 또는 긴 초기화를 지원합니다

byte[] eightBytesAgain = toBytes(0x0102030405060708L);

1

아파치 커먼즈를 사용하는 경우

public static byte[] toByteArray(int value) {
    byte result[] = new byte[4];
    return Conversion.intToByteArray(value, 0, result, 0, 4);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.