ChatGPT解决这个技术问题 Extra ChatGPT

Java integer to byte array

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?


d
dfa

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

Or use the format "0x%02X" if you always want two hexadecimal characters as well as uppercase hexadecimals, e.g. System.out.format("0x%02X", (byte) 10) displays 0x0A.
@conor Javadoc says that allocateDirect() does have a cost and should be used when a buffer is kept for a while. Although the answer works it seems to be a bit of overkill for the use case at hand.
You can use Integer.SIZE/8 to avoid hardcoding the 4, which is a pattern that works well for other types like Long.
@davenpcj You can even use Integer.SIZE / Byte.SIZE
@rkosegi Or even Integer.BYTES since Java 8 :)
G
Grzegorz Oledzki

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.


I see your point, but for this particular task 'my' code is more declarative and clear than some 'magic' ByteBuffer, which one has to check to see what it does.
@Kevin - that's very harsh - there are plenty of cases where this kind of code is appropriate, e.g. in image processing. The JDK libraries are great in general, but they don't cover and/or aren't optimised for all use cases.
agreed; the overhead and complexity of ByteBuffer may not be appropriate compared to some simple and well known byte operations.
Another point I'd add is that you've used the unsigned right shift operator >>> rather than the right shift operator >> (docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html) so behavior may not be as desired/as expected with signed vs unsigned numbers
Note: this is BigEndian. If you need LittleEndian you have to reverse the order.
M
Marijn

BigInteger.valueOf(1695609641).toByteArray()


what guarantee do you have that that will produce a 4 byte array?
Exactly what MeBigFatGuy wrote. Javadoc of BigInteger.toByteArray() states: "The array will contain the minimum number of bytes required to represent this BigInteger..."
Where in the question does it ask for the byte array to be of fixed length 4? Depending on algorithm this is meant to be part of you can utilize the length of the array
this is much more dynamic and should be the right answer. You can simply do an Array append to create the desired size if you like. Specially when you have to consider Java signed int values.
This seems to create one byte for 0x7f and two bytes for 0x80 ( the two bytes being: 0x0 0x80 ).
d
db80
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;        
}

A
Aleksandr Dubinsky

Using Guava:

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

C
Carl Smotricz
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;

That extracts the least significant 8 bytes. It also avoids dragging the input number's sign into the converted octet.
stackoverflow.com/questions/35305634/… - can you please solve this C# into Java?
l
lyon819
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;
}

H
HaoQi Li

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

use of ObjectOutputStream is incorrect. Use DataOutputStream, use of OOS makes it so the byte array is not 4 bytes.
j
jytou

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.


N
Neeraj

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

B
Brian Agnew
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.


m
mlohbihler

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.


s
superbob

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