Явный целочисленный массив байтов

Я получил целое число: 1695609641

когда я использую метод:

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

дает:

6510f329

но я хочу массив байтов:

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

Как я могу это сделать?

Ответ 1

с использованием 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 

Ответ 2

Как насчет:

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

Идея не моя. Я взял его из сообщение на dzone.com.

Ответ 3

BigInteger.valueOf(1695609641).toByteArray()

Ответ 4

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;
}

Ответ 5

Используя Guava:

byte[] bytearray = Ints.toByteArray(1695609641);

Ответ 6

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;

Ответ 7

Ниже приведенные фрагменты работают, по крайней мере, для отправки int поверх 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;
}

Ответ 8

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;
}

Ответ 9

Класс org.apache.hadoop.hbase.util.Bytes имеет кучу удобных методов преобразования byte [], но вы можете не захотеть добавить всю банку HBase в свой проект именно для этой цели. Удивительно, что не только такой метод пропускает AFAIK из JDK, но также и из очевидных libs, таких как commons io.

Ответ 10

Моя попытка:

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);

Ответ 11

integer & 0xFF

для первого байта

(integer >> 8) & 0xFF

для второго и цикла и т.д., записывая в предварительно выделенный массив байтов. К сожалению, немного грязно.