ฉันมีอาร์เรย์ 8 ไบต์และต้องการแปลงเป็นค่าตัวเลขที่สอดคล้องกัน
เช่น
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
ฉันต้องการวิธีที่จะดำเนินการแปลงข้างต้น
ฉันมีอาร์เรย์ 8 ไบต์และต้องการแปลงเป็นค่าตัวเลขที่สอดคล้องกัน
เช่น
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
ฉันต้องการวิธีที่จะดำเนินการแปลงข้างต้น
new BigInteger(by).longValue()
คำตอบ:
สมมติว่าไบต์แรกเป็นไบต์ที่มีนัยสำคัญน้อยที่สุด:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value += ((long) by[i] & 0xffL) << (8 * i);
}
เป็นไบต์แรกที่สำคัญที่สุดจากนั้นจึงแตกต่างกันเล็กน้อย:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value = (value << 8) + (by[i] & 0xff);
}
แทนที่แบบยาวด้วยBigIntegerหากคุณมีมากกว่า 8 ไบต์
ขอบคุณ Aaron Digulla สำหรับการแก้ไขข้อผิดพลาดของฉัน
value += ((long)by[i] & 0xffL) << (8 * i);
หนึ่งสามารถใช้Buffer
s ที่มีให้เป็นส่วนหนึ่งของjava.nio
แพ็คเกจเพื่อทำการแปลง
ที่นี่byte[]
อาร์เรย์ต้นทางมีความยาว 8 ซึ่งเป็นขนาดที่สอดคล้องกับlong
ค่า
ขั้นแรกbyte[]
อาร์เรย์จะถูกรวมไว้ใน a ByteBuffer
จากนั้นByteBuffer.getLong
จึงเรียกเมธอดเพื่อรับlong
ค่า:
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();
System.out.println(l);
ผลลัพธ์
4
ฉันขอขอบคุณ dfa ที่ชี้ให้เห็นByteBuffer.getLong
วิธีการในความคิดเห็น
แม้ว่าอาจใช้ไม่ได้ในสถานการณ์นี้ แต่ความสวยงามของBuffer
s มาพร้อมกับการดูอาร์เรย์ที่มีค่าหลายค่า
ตัวอย่างเช่นถ้าเรามีอาร์เรย์ 8 ไบต์และเราต้องการดูเป็นสองint
ค่าเราสามารถรวมbyte[]
อาร์เรย์ไว้ใน an ByteBuffer
ซึ่งดูเป็น a IntBuffer
และรับค่าโดยIntBuffer.get
:
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);
System.out.println(i0);
System.out.println(i1);
ผลลัพธ์:
1
4
หากเป็นค่าตัวเลข 8 ไบต์คุณสามารถลอง:
BigInteger n = new BigInteger(byteArray);
หากนี่เป็นบัฟเฟอร์อักขระ UTF-8 คุณสามารถลอง:
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
เพียงแค่คุณสามารถใช้หรืออ้างถึงguava lib ที่ Google จัดหาให้ซึ่งมีวิธีการใช้ประโยชน์สำหรับการแปลงระหว่างอาร์เรย์แบบยาวและไบต์ รหัสลูกค้าของฉัน:
long content = 212000607777l;
byte[] numberByte = Longs.toByteArray(content);
logger.info(Longs.fromByteArray(numberByte));
คุณยังสามารถใช้ BigInteger สำหรับไบต์ที่มีความยาวผันแปรได้ คุณสามารถแปลงเป็นแบบยาวจำนวนเต็มหรือแบบสั้นก็ได้ตามความต้องการของคุณ
new BigInteger(bytes).intValue();
หรือเพื่อแสดงถึงขั้ว:
new BigInteger(1, bytes).intValue();
กรอกรหัสแปลง java สำหรับประเภทดั้งเดิมทั้งหมดไปยัง / จากอาร์เรย์ http://www.daniweb.com/code/snippet216874.html
แต่ละเซลล์ในอาร์เรย์จะถือว่าเป็น int ที่ไม่ได้ลงนาม:
private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
return res;
for (int i=0;i<bytes.length;i++){
res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}
public static long byteArrayToLong(byte[] bytes) {
return ((long) (bytes[0]) << 56)
+ (((long) bytes[1] & 0xFF) << 48)
+ ((long) (bytes[2] & 0xFF) << 40)
+ ((long) (bytes[3] & 0xFF) << 32)
+ ((long) (bytes[4] & 0xFF) << 24)
+ ((bytes[5] & 0xFF) << 16)
+ ((bytes[6] & 0xFF) << 8)
+ (bytes[7] & 0xFF);
}
แปลงอาร์เรย์ไบต์ (ยาว 8 ไบต์) เป็นยาว