Java整数到字节数组

时间:2010-02-02 10:17:46

标签: java arrays integer byte

我得到了一个整数:1695609641

当我使用方法时:

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

给出:

6510f329

但我想要一个字节数组:

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

我该怎么做?

13 个答案:

答案 0 :(得分:273)

使用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 

答案 1 :(得分:137)

怎么样:

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

这个想法是不是我的。我是从some post on dzone.com获得的。

答案 2 :(得分:40)

BigInteger.valueOf(1695609641).toByteArray()

答案 3 :(得分:22)

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

答案 4 :(得分:16)

使用Guava

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

答案 5 :(得分: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;

答案 6 :(得分:4)

下面的块至少可以用于通过UDP发送int。

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

字节数组到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;
}

答案 7 :(得分:4)

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

答案 8 :(得分:1)

类org.apache.hadoop.hbase.util.Bytes有一堆方便的byte []转换方法,但您可能不希望为此目的将整个HBase jar添加到项目中。令人惊讶的是,这样的方法不仅缺少来自JDK的AFAIK,还来自明显的libs,如commons io。

答案 9 :(得分: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);

Full class在这里:https://gist.github.com/superbob/6548493,它支持从short或long

初始化
byte[] eightBytesAgain = toBytes(0x0102030405060708L);

答案 10 :(得分:1)

因为通常你希望稍后将这个数组转换回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;
}

请注意,由于符号传播等原因,&#34;&amp;为0xFF ...&#34;转换回int时需要。

答案 11 :(得分:0)

integer & 0xFF

表示第一个字节

(integer >> 8) & 0xFF

用于第二个和循环等,写入预分配的字节数组。不幸的是,有点乱。

答案 12 :(得分:0)

如果您正在使用apache-commons

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