Saya memiliki array 8 byte dan saya ingin mengubahnya menjadi nilai numerik yang sesuai.
misalnya
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
Saya menginginkan metode yang akan melakukan operasi konversi di atas.
new BigInteger(by).longValue()
Jawaban:
Dengan asumsi byte pertama adalah byte paling signifikan:
long value = 0; for (int i = 0; i < by.length; i++) { value += ((long) by[i] & 0xffL) << (8 * i); }
Apakah byte pertama yang paling signifikan, kemudian sedikit berbeda:
long value = 0; for (int i = 0; i < by.length; i++) { value = (value << 8) + (by[i] & 0xff); }
Ganti long dengan BigInteger , jika Anda memiliki lebih dari 8 byte.
Terima kasih kepada Aaron Digulla atas koreksi kesalahan saya.
sumber
value += ((long)by[i] & 0xffL) << (8 * i);
Seseorang dapat menggunakan
Buffer
s yang disediakan sebagai bagian darijava.nio
paket untuk melakukan konversi.Di sini,
byte[]
larik sumber memiliki panjang 8, yang merupakan ukuran yang sesuai dengan suatulong
nilai.Pertama,
byte[]
array dibungkus dalam aByteBuffer
, dan kemudianByteBuffer.getLong
metode dipanggil untuk mendapatkanlong
nilai:ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4}); long l = bb.getLong(); System.out.println(l);
Hasil
4
Saya ingin berterima kasih kepada dfa karena menunjukkan
ByteBuffer.getLong
metode ini di komentar.Meskipun mungkin tidak dapat diterapkan dalam situasi ini, keindahan
Buffer
datang dengan melihat array dengan banyak nilai.Misalnya, jika kita memiliki array 8 byte, dan kita ingin melihatnya sebagai dua
int
nilai, kita bisa membungkusbyte[]
array dalamByteBuffer
, yang dipandang sebagai aIntBuffer
dan mendapatkan nilainya denganIntBuffer.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);
Hasil:
1 4
sumber
Jika ini adalah nilai numerik 8 byte, Anda dapat mencoba:
BigInteger n = new BigInteger(byteArray);
Jika ini adalah buffer karakter UTF-8, maka Anda dapat mencoba:
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
sumber
Sederhananya, Anda dapat menggunakan atau merujuk ke guava lib yang disediakan oleh google, yang menawarkan metode berguna untuk konversi antara array panjang dan byte. Kode klien saya:
long content = 212000607777l; byte[] numberByte = Longs.toByteArray(content); logger.info(Longs.fromByteArray(numberByte));
sumber
Anda juga dapat menggunakan BigInteger untuk byte dengan panjang variabel. Anda dapat mengubahnya menjadi Long, Integer atau Short, mana saja yang sesuai dengan kebutuhan Anda.
new BigInteger(bytes).intValue();
atau untuk menunjukkan polaritas:
new BigInteger(1, bytes).intValue();
sumber
Kode konverter java lengkap untuk semua tipe primitif ke / dari array http://www.daniweb.com/code/snippet216874.html
sumber
Setiap sel dalam larik diperlakukan sebagai unsigned 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; }
sumber