แปลงบิตสั้นให้เป็น int

ฉันมีแพ็กเก็ต TCP ที่ส่งตัวแปรที่ไม่ได้ลงนามจำนวนมาก (ไม่ได้ลงนามเนื่องจากประหยัดพื้นที่และใช้ขีดจำกัดสำหรับ ID ที่ไม่ซ้ำกัน) ฉันต้องแปลงข้อมูลบิตสั้นที่ไม่ได้ลงนามนี้เป็นจำนวนเต็มใน java

ดังนั้นคำถามของฉันคือฉันจะแปลง byteArray[0 - 15] เป็น int ได้อย่างไร

แก้ไข:

นี่คือรหัสที่ฉันเปลี่ยนเป็น:

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

บัฟเฟอร์ข้อมูลที่เข้ามาคือ:

bit   0    1   2   3   4   5   6   7   8   9

value 40   0   0   0   8   0   0   0   1   0

ข้อมูลจะถูกส่งเป็น Little Endian ฉันคิดว่าเนื่องจาก BigInteger ถือว่าใหญ่ ฉันจึงต้องแปลงเป็นสิ่งนั้น อย่างไรก็ตาม ไม่ว่าจะสั่งมากหรือน้อยก็ให้มูลค่าเท่ากันเป็นการตอบแทน

ฉันคาดว่าจะได้ 1 สำหรับค่า requestedDateType แต่ฉันได้รับ 256 ฉันจะแพดไบต์ที่หายไปทั้งสองไบต์เพื่อให้แน่ใจว่ามันให้ฉัน 0000 0000 0000 0001 แทนที่จะเป็น 0000 0001 0000 0000

แก้ไข 2:

ช่างเถอะ. เปลี่ยนรหัสเป็น:

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 แหล่งที่มา


คำตอบ (2)


ใช้ ByteBuffer ในแพ็คเกจ 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 ยังมีกิจวัตรสำหรับการแปลงดั้งเดิมเป็นไบต์หากคุณสนใจไลบรารีภายนอก: http://code.google.com/p/guava-libraries/

นอกจากนี้ ฉันไม่ทราบกรณีการใช้งานของคุณ แต่ถ้าคุณอยู่ในขั้นเริ่มต้นของโครงการ ฉันจะใช้ ProtoBufs ของ Google เพื่อแลกเปลี่ยนข้อมูลโปรโตคอล ช่วยลดอาการปวดหัวเมื่อเปลี่ยนระหว่างเวอร์ชันโปรโตคอล สร้างเอาต์พุตไบนารีที่มีขนาดกะทัดรัดมาก และรวดเร็ว

นอกจากนี้ หากคุณเปลี่ยนภาษา คุณสามารถค้นหาไลบรารี protobufs สำหรับภาษานั้นได้ และไม่ต้องเขียนโค้ดโปรโตคอลใหม่ทั้งหมด

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

person William Morrison    schedule 24.06.2013
comment
ByteBuffer.wrap(bytes).getInt()จะทำสิ่งเดียวกันหรือไม่? - person Petr Janeček; 25.06.2013
comment
ครับ ฉันจะเพิ่มตัวอย่างสำหรับเรื่องนั้น - person William Morrison; 25.06.2013