Ubah bit pendek menjadi int

Saya memiliki paket TCP yang mengirimkan banyak variabel yang tidak ditandatangani (mereka tidak ditandatangani karena menghemat ruang dan menggunakan batasan untuk ID unik), saya perlu mengubah data bit pendek yang tidak ditandatangani ini menjadi Integer di java.

Jadi pertanyaan saya adalah bagaimana cara mengubah byteArray[0 - 15] menjadi int?

Sunting:

Ini kode yang telah saya ubah:

ByteOrder order = ByteOrder.BIG_ENDIAN;
requestedDateType = new BigInteger(ByteBuffer.allocate(2).put(data, 8, 2).order(order).array()).intValue();

Buffer data yang masuk adalah:

bit   0    1   2   3   4   5   6   7   8   9

value 40   0   0   0   8   0   0   0   1   0

Data dikirim sebagai Little Endian. Saya berasumsi karena BigInteger berasumsi besar, saya perlu mengonversinya. Namun baik Pesanan besar maupun kecil memberi saya nilai yang sama sebagai imbalannya.

Saya berharap mendapatkan 1 untuk nilai requestedDateType namun saya mendapatkan 256. Bagaimana cara mengisi dua byte yang hilang untuk memastikan itu memberi saya 0000 0000 0000 0001 bukannya 0000 0001 0000 0000

Sunting 2:

Sudahlah. Mengubah kode menjadi ini:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(data, 8, 2);
int value = ((int)bb.getShort(0)) & 0xff;

person JeremyK    schedule 24.06.2013    source sumber


Jawaban (2)


Gunakan ByteBuffer dalam paket java.nio.

//Convert unsigned short to bytes:
//java has no unsigned short. Char is the equivalent.
char unsignedShort = 100;
//Endianess of bytes. I recommend setting explicitly for clarity
ByteOrder order = ByteOrder.BIG_ENDIAN;
byte[] ary = ByteBuffer.allocate(2).putChar(value).order(order).array();

//get integers from 16 bytes
byte[] bytes = new byte[16];
ByteBuffer buffer= ByteBuffer.wrap(bytes);
for(int i=0;i<4;i++){
    int intValue = (int)buffer.getInt();
}

Guava juga memiliki rutinitas untuk konversi primitif ke byte jika Anda tertarik dengan perpustakaan eksternal: http://code.google.com/p/guava-libraries/

Selain itu, saya tidak tahu kasus penggunaan Anda, tetapi jika Anda berada di tahap awal proyek, saya akan menggunakan ProtoBufs Google untuk bertukar informasi protokol. Ini meringankan sakit kepala saat melakukan transisi antar versi protokol, menghasilkan keluaran biner yang sangat ringkas, dan cepat.

Juga jika Anda mengubah bahasa, Anda dapat menemukan perpustakaan protobufs untuk bahasa tersebut dan tidak menulis ulang semua kode protokol Anda.

http://code.google.com/p/protobuf/

person William Morrison    schedule 24.06.2013
comment
Akankah ByteBuffer.wrap(bytes).getInt() melakukan hal yang sama? - person Petr Janeček; 25.06.2013
comment
Ya pak, saya akan menambahkan contoh untuk itu. - person William Morrison; 25.06.2013

Saya akhirnya menggunakan sumber daya ini: http://www.javamex.com/java_equivalents/unsigned.shtml

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(data, 8, 2);
requestedDateType = ((int)bb.getShort(0)) & 0xff;

Saya menyalin dua byte menjadi short, lalu mengubahnya menjadi int dan menghapus tandanya.

person JeremyK    schedule 25.06.2013