Java integer to byte array

JavaArraysIntegerByte

Java Problem Overview


I got an integer: 1695609641

when I use method:

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

gives:

6510f329

but I want a byte array:

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

How can I make this?

Java Solutions


Solution 1 - Java

using Java NIO's ByteBuffer is very simple:

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

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

output:

0x65 0x10 0xf3 0x29

Solution 2 - Java

How about:

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

The idea is not mine. I've taken it from some post on dzone.com.

Solution 3 - Java

BigInteger.valueOf(1695609641).toByteArray()

Solution 4 - Java

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

Solution 5 - Java

Using Guava:

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

Solution 6 - Java

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;

Solution 7 - Java

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

Solution 8 - Java

The chunks below work at least for sending an int over UDP.

int to byte array:

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

byte array to 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;
}

Solution 9 - Java

Because generally you would want to convert this array back to an int at a later point, here are the methods to convert an array of ints into an array of bytes and vice-versa:

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

Note that because of sign propagation and such, the "& 0xFF..." are needed when converting back to the int.

Solution 10 - Java

If you're using apache-commons

public static byte[] toByteArray(int value) {
    byte result[] = new byte[4];
    return Conversion.intToByteArray(value, 0, result, 0, 4);
}

Solution 11 - Java

integer & 0xFF

for the first byte

(integer >> 8) & 0xFF

for the second and loop etc., writing into a preallocated byte array. A bit messy, unfortunately.

Solution 12 - Java

The class org.apache.hadoop.hbase.util.Bytes has a bunch of handy byte[] conversion methods, but you might not want to add the whole HBase jar to your project just for this purpose. It's surprising that not only are such method missing AFAIK from the JDK, but also from obvious libs like commons io.

Solution 13 - Java

My try :

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

With it you can do this :

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

Full class is here : https://gist.github.com/superbob/6548493, it supports initialization from shorts or long

byte[] eightBytesAgain = toBytes(0x0102030405060708L);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionstefanView Question on Stackoverflow
Solution 1 - JavadfaView Answer on Stackoverflow
Solution 2 - JavaGrzegorz OledzkiView Answer on Stackoverflow
Solution 3 - JavavmpnView Answer on Stackoverflow
Solution 4 - JavaYury FinchenkoView Answer on Stackoverflow
Solution 5 - JavaAleksandr DubinskyView Answer on Stackoverflow
Solution 6 - JavaCarl SmotriczView Answer on Stackoverflow
Solution 7 - Javalyon819View Answer on Stackoverflow
Solution 8 - JavaHaoQi LiView Answer on Stackoverflow
Solution 9 - JavajytouView Answer on Stackoverflow
Solution 10 - JavaNeerajView Answer on Stackoverflow
Solution 11 - JavaBrian AgnewView Answer on Stackoverflow
Solution 12 - JavamlohbihlerView Answer on Stackoverflow
Solution 13 - JavasuperbobView Answer on Stackoverflow