Java integer ke byte array


190

Saya mendapat bilangan bulat: 1695609641

ketika saya menggunakan metode:

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

memberi:

6510f329

tapi saya ingin array byte:

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

Bagaimana saya bisa membuat ini?


4
kemungkinan duplikat dari integer Konversi ke byte array (Java)
finnw

Jawaban:


293

menggunakan Java NIO's ByteBuffer sangat sederhana:

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

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

keluaran:

0x65 0x10 0xf3 0x29 

4
Atau gunakan format "0x%02X"jika Anda selalu menginginkan dua karakter heksadesimal serta heksadesimal huruf besar, mis . System.out.format("0x%02X", (byte) 10)Tampilan 0x0A.
Maarten Bodewes

12
Anda dapat menggunakan Integer.SIZE / 8 untuk menghindari hardcoding 4, yang merupakan pola yang bekerja dengan baik untuk tipe lain seperti Long.
davenpcj

3
@davenpcj Anda bahkan dapat menggunakan Integer.SIZE / Byte.SIZE
rkosegi

11
@rkosegi Atau bahkan Integer.BYTES sejak Java 8 :)
drvdijk

1
@MaartenBodewes utas tidak memiliki format apa pun yang terlihat, tetapi operasi tipe asli
Jacek Cz

146

Bagaimana tentang:

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

Idenya bukan milikku . Saya telah mengambilnya dari beberapa posting di dzone.com .


44
Saya mengerti maksud Anda, tetapi untuk tugas khusus ini, kode 'saya' lebih deklaratif dan jelas daripada ByteBuffer 'ajaib', yang harus diperiksa untuk melihat apa fungsinya.
Grzegorz Oledzki

24
@Kevin - itu sangat keras - ada banyak kasus di mana kode semacam ini sesuai, misalnya dalam pemrosesan gambar. Pustaka JDK sangat bagus secara umum, tetapi tidak mencakup dan / atau tidak dioptimalkan untuk semua kasus penggunaan.
mikera

14
sepakat; overhead dan kompleksitas ByteBuffer mungkin tidak sesuai dibandingkan dengan beberapa operasi byte sederhana dan terkenal.
swdunlop

6
Poin lain yang saya tambahkan adalah bahwa Anda telah menggunakan operator shift kanan yang tidak ditandatangani >>>daripada operator shift kanan >>( docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html ) sehingga perilaku mungkin tidak seperti yang diinginkan / seperti yang diharapkan dengan angka yang sudah ditandatangani vs yang tidak ditandatangani
RobV

4
Pendekatan ini tampaknya sedikit lebih cepat daripada metode ByteBuffer atau BigInteger yang disebutkan. Sesuatu yang perlu dipertimbangkan jika Anda akan melakukan banyak konversi.
seeker

45

BigInteger.valueOf(1695609641).toByteArray()


2
jaminan apa yang Anda miliki yang akan menghasilkan array 4 byte?
MeBigFatGuy

2
Persis seperti yang ditulis MeBigFatGuy. Javadoc of States BigInteger.toByteArray(): "Array akan berisi jumlah minimum byte yang diperlukan untuk mewakili BigInteger ini ..."
icza

2
Di mana dalam pertanyaan apakah ia meminta array byte memiliki panjang tetap 4? Bergantung pada algoritma, ini dimaksudkan untuk menjadi bagian dari Anda dapat memanfaatkan panjang array
vmpn

ini jauh lebih dinamis dan harus menjadi jawaban yang tepat. Anda bisa melakukan penambahan Array untuk membuat ukuran yang diinginkan jika Anda mau. Khususnya ketika Anda harus mempertimbangkan nilai int Java ditandatangani.
Droid Chris

2
Ini tampaknya membuat satu byte untuk 0x7f dan dua byte untuk 0x80 (dua byte tersebut adalah: 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
Itu mengekstrak 8 byte paling signifikan. Ini juga menghindari menyeret tanda nomor input ke oktet yang dikonversi.
Carl Smotricz

stackoverflow.com/questions/35305634/... - bisakah Anda menyelesaikan C # ini ke dalam 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

Potongan di bawah ini berfungsi setidaknya untuk mengirim int melalui UDP.

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

array byte ke 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
penggunaan ObjectOutputStream salah. Gunakan DataOutputStream, gunakan OOS sehingga array byte tidak 4 byte.
MeBigFatGuy

2

Karena umumnya Anda ingin mengonversi array ini kembali ke int di lain waktu, berikut adalah metode untuk mengubah array int menjadi array byte dan sebaliknya:

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

Perhatikan bahwa karena propagasi tanda dan semacamnya, "& 0xFF ..." diperlukan saat mengonversi kembali ke int.


1
integer & 0xFF

untuk byte pertama

(integer >> 8) & 0xFF

untuk yang kedua dan seterusnya, menulis ke dalam array byte yang telah dialokasikan sebelumnya. Agak berantakan, sayangnya.


1

Kelas org.apache.hadoop.hbase.util.Bytes memiliki banyak metode konversi byte [] yang berguna, tetapi Anda mungkin tidak ingin menambahkan seluruh tabung HBase ke proyek Anda hanya untuk tujuan ini. Mengejutkan bahwa tidak hanya metode seperti itu yang menghilangkan AFAIK dari JDK, tetapi juga dari lib yang jelas seperti commons io.


1

Usaha saya:

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

Dengan itu Anda bisa melakukan ini:

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

Kelas penuh ada di sini: https://gist.github.com/superbob/6548493 , mendukung inisialisasi dari celana pendek atau panjang

byte[] eightBytesAgain = toBytes(0x0102030405060708L);

1

Jika Anda menggunakan apache-commons

public static byte[] toByteArray(int value) {
    byte result[] = new byte[4];
    return Conversion.intToByteArray(value, 0, result, 0, 4);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.