Mengonversi array byte ke float python

Dalam tutorial ini, kita akan menjelajahi berbagai pendekatan untuk mengonversi larik byte menjadi nilai numerik (int, long, float, double) dan sebaliknya

Byte adalah unit dasar informasi dalam penyimpanan dan pemrosesan komputer. Tipe primitif yang didefinisikan dalam bahasa Java adalah cara mudah untuk memanipulasi banyak byte pada saat yang bersamaan. Oleh karena itu, ada hubungan konversi yang melekat antara array byte dan tipe primitif

Karena tipe short dan char hanya terdiri dari dua byte, mereka tidak membutuhkan banyak perhatian. Jadi, kita akan fokus pada konversi antara array byte dan tipe int, long, float, dan double

2. Menggunakan Shift Operator

Cara paling mudah untuk mengonversi array byte menjadi nilai numerik adalah menggunakan

2. 1. Byte Array ke int dan long

Saat mengonversi array byte ke nilai int, kami menggunakan operator << (geser kiri).

int value = 0;
for (byte b : bytes) {
    value = (value << 8) + (b & 0xFF);
}

Biasanya, panjang larik byte dalam cuplikan kode di atas harus sama dengan atau kurang dari empat. Itu karena nilai int menempati empat byte. Jika tidak, itu akan menyebabkan int range overflow

Untuk memverifikasi kebenaran konversi, mari kita tentukan dua konstanta

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_

Jika kita melihat lebih dekat pada dua konstanta ini, INT_BYTE_ARRAY dan INT_VALUE, kita akan menemukan bahwa keduanya merupakan representasi yang berbeda dari angka heksadesimal 0xCAFEBABE

Kemudian, mari kita periksa apakah konversi ini benar

int value = convertByteArrayToIntUsingShiftOperator(INT_BYTE_ARRAY);

assertEquals(INT_VALUE, value);

Demikian pula, saat mengonversi larik byte ke nilai panjang, kita dapat menggunakan kembali cuplikan kode di atas dengan dua modifikasi. tipe nilainya panjang dan panjang byte harus sama dengan atau kurang dari delapan

2. 2. int dan long ke Byte Array

Saat mengonversi nilai int ke array byte, kita dapat menggunakan operator >> (geser kanan bertanda tangan) atau >>> (geser kanan tak bertanda tangan)

byte[] bytes = new byte[Integer.BYTES];
int length = bytes.length;
for (int i = 0; i < length; i++) {
    bytes[length - i - 1] = (byte) (value & 0xFF);
    value >>= 8;
}

Pada cuplikan kode di atas, kita dapat mengganti operator >> dengan operator >>>. Itu karena kami hanya menggunakan byte yang awalnya berisi parameter nilai. Jadi, pergeseran kanan dengan ekstensi tanda atau ekstensi nol tidak akan mempengaruhi hasil akhir

Kemudian, kita dapat memeriksa kebenaran konversi di atas

byte[] bytes = convertIntToByteArrayUsingShiftOperator(INT_VALUE);

assertArrayEquals(INT_BYTE_ARRAY, bytes);
_

Saat mengonversi nilai long ke array byte, kita hanya perlu mengubah Integer. BYTE ke Panjang. BYTES dan pastikan jenis nilainya panjang

2. 3. Byte Array untuk mengapung dan menggandakan

Saat mengonversi array byte menjadi pelampung, kami menggunakan Float. metode intBitsToFloat()

// convert bytes to int
int intValue = 0;
for (byte b : bytes) {
    intValue = (intValue << 8) + (b & 0xFF);
}

// convert int to float
float value = Float.intBitsToFloat(intValue);

Dari cuplikan kode di atas, kita dapat mengetahui bahwa array byte tidak dapat diubah langsung menjadi nilai float. Pada dasarnya, dibutuhkan dua langkah terpisah. Pertama, kami mentransfer dari array byte ke nilai int, dan kemudian kami menginterpretasikan pola bit yang sama menjadi nilai float

Untuk memverifikasi kebenaran konversi, mari kita tentukan dua konstanta

byte[] FLOAT_BYTE_ARRAY = new byte[] {
    (byte) 0x40, (byte) 0x48, (byte) 0xF5, (byte) 0xC3
};
float FLOAT_VALUE = 3.14F;
_

Kemudian, mari kita periksa apakah konversi ini benar

float value = convertByteArrayToFloatUsingShiftOperator(FLOAT_BYTE_ARRAY);

assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value));

Dengan cara yang sama, kita dapat menggunakan nilai menengah panjang dan Double. metode longBitsToDouble() untuk mengonversi larik byte menjadi nilai ganda

2. 4. float dan gandakan ke Byte Array

Saat mengonversi float ke array byte, kita dapat memanfaatkan Float. metode floatToIntBits()

// convert float to int
int intValue = Float.floatToIntBits(value);

// convert int to bytes
byte[] bytes = new byte[Float.BYTES];
int length = bytes.length;
for (int i = 0; i < length; i++) {
    bytes[length - i - 1] = (byte) (intValue & 0xFF);
    intValue >>= 8;
}
_

Kemudian, mari kita periksa apakah konversi ini benar

byte[] bytes = convertFloatToByteArrayUsingShiftOperator(FLOAT_VALUE);

assertArrayEquals(FLOAT_BYTE_ARRAY, bytes);
_

Dengan analogi, kita bisa memanfaatkan si Ganda. metode doubleToLongBits() untuk mengonversi nilai ganda menjadi larik byte

3. Menggunakan ByteBuffer

Jawa. nio. Kelas ByteBuffer menyediakan cara yang rapi dan terpadu untuk menerjemahkan antara array byte dan nilai numerik (int, long, float, double)

3. 1. Byte Array ke Nilai Numerik

Sekarang, kami menggunakan kelas ByteBuffer untuk mengonversi array byte menjadi nilai int

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_0

Kemudian, kami menggunakan kelas ByteBuffer untuk mengubah nilai int menjadi array byte

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_1

Perlu dicatat bahwa dua cuplikan kode di atas mengikuti pola yang sama

  • Pertama, kami menggunakan ByteBuffer. mengalokasikan(int) metode untuk mendapatkan objek ByteBuffer dengan kapasitas tertentu
  • Kemudian, kami menempatkan nilai asli (array byte atau nilai int) ke dalam objek ByteBuffer, seperti buffer. put(bytes) dan buffer. metode putInt(nilai).
  • Setelah itu kita reset posisi objek ByteBuffer menjadi nol, agar kita bisa membaca dari awal
  • Terakhir, kita mendapatkan nilai target dari objek ByteBuffer, menggunakan metode seperti buffer. getInt() dan penyangga. Himpunan()

Pola ini sangat fleksibel, dan mendukung konversi tipe long, float, dan double. Satu-satunya modifikasi yang perlu kita buat adalah informasi terkait tipe

3. 2. Menggunakan Larik Byte yang Ada

Selain itu, ByteBuffer. metode wrap(byte[]) memungkinkan kita untuk menggunakan kembali array byte yang ada tanpa membuat yang baru

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_2

Namun, kita juga harus mencatat bahwa panjang variabel bytes di atas sama dengan atau lebih besar dari ukuran tipe target (Float. BYTE). Jika tidak, itu akan melempar BufferUnderflowException

4. Menggunakan BigInteger

Tujuan utama dari java. matematika. Kelas BigInteger adalah untuk mewakili nilai numerik besar yang tidak sesuai dengan tipe data primitif. Meskipun kita dapat menggunakannya untuk mengonversi antara array byte dan nilai primitif, menggunakan BigInteger agak berat untuk tujuan semacam ini

4. 1. Byte Array ke int dan long

Sekarang, mari gunakan kelas BigInteger untuk mengonversi array byte menjadi nilai int

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_3

Demikian pula, kelas BigInteger memiliki metode longValue() untuk mengonversi array byte menjadi nilai long

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_4

Selain itu, kelas BigInteger juga memiliki metode intValueExact() dan metode longValueExact(). Kedua metode ini harus digunakan dengan hati-hati. jika objek BigInteger masing-masing berada di luar jangkauan tipe int atau long, kedua metode akan melempar ArithmeticException

Saat mengonversi nilai int atau long ke array byte, kita dapat menggunakan cuplikan kode yang sama

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_5

Namun, metode toByteArray() dari kelas BigInteger mengembalikan jumlah byte minimum, tidak harus empat atau delapan byte

4. 2. Byte Array untuk mengapung dan menggandakan

Meskipun kelas BigInteger memiliki metode floatValue() , kita tidak dapat menggunakannya untuk mengonversi larik byte menjadi nilai float seperti yang diharapkan. Jadi apa yang harus kita lakukan?

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_6

Dengan cara yang sama, kita dapat mengonversi nilai float menjadi array byte

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_7

Begitu juga dengan memanfaatkan Double. longBitsToDouble() dan Double. metode doubleToLongBits() , kita dapat menggunakan kelas BigInteger untuk mengonversi antara array byte dan nilai ganda

5. Menggunakan jambu biji

Pustaka Guava memberi kita metode mudah untuk melakukan konversi semacam ini

5. 1. Byte Array ke int dan long

Di dalam Guava, kelas Ints di com. google. umum. paket primitif berisi metode fromByteArray(). Oleh karena itu, cukup mudah bagi kita untuk mengubah array byte menjadi nilai int

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_8

Kelas Ints juga memiliki metode toByteArray() yang dapat digunakan untuk mengonversi nilai int menjadi array byte

byte[] INT_BYTE_ARRAY = new byte[] {
    (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int INT_VALUE = 0xCAFEBABE;
_9

Dan, kelas Longs serupa digunakan dengan kelas Ints

int value = convertByteArrayToIntUsingShiftOperator(INT_BYTE_ARRAY);

assertEquals(INT_VALUE, value);
0

Selanjutnya, jika kita memeriksa kode sumber dari metode fromByteArray() dan toByteArray() , kita dapat mengetahui bahwa kedua metode tersebut menggunakan operator shift untuk melakukan tugasnya

5. 2. Byte Array untuk mengapung dan menggandakan

Ada juga kelas Floats dan Doubles dalam paket yang sama. Namun, tidak satu pun dari kedua kelas ini yang mendukung metode fromByteArray() dan toByteArray()

Namun, kita bisa memanfaatkan Float. intBitsToFloat(), Float. floatToIntBits(), Gandakan. longBitsToDouble(), dan Gandakan. metode doubleToLongBits() untuk menyelesaikan konversi antara larik byte dan nilai float atau double. Untuk singkatnya, kami telah menghilangkan kode di sini

6. Menggunakan Commons Lang

Saat kami menggunakan Apache Commons Lang 3, agak rumit untuk melakukan konversi semacam ini. Itu karena perpustakaan Commons Lang menggunakan array byte little-endian secara default. Namun, array byte yang kami sebutkan di atas semuanya dalam urutan big-endian. Jadi, kita perlu mengubah array byte big-endian menjadi array byte little-endian dan sebaliknya

6. 1. Byte Array ke int dan long

Kelas Konversi di org. apache. milik bersama. paket lang3 menyediakan metode byteArrayToInt() dan intToByteArray()

Sekarang, mari ubah array byte menjadi nilai int

int value = convertByteArrayToIntUsingShiftOperator(INT_BYTE_ARRAY);

assertEquals(INT_VALUE, value);
1

Pada kode di atas, kita membuat salinan dari variabel byte asli. Ini karena terkadang, kita tidak ingin mengubah isi dari array byte asli

Kemudian, mari kita ubah nilai int menjadi array byte

int value = convertByteArrayToIntUsingShiftOperator(INT_BYTE_ARRAY);

assertEquals(INT_VALUE, value);
2

Kelas Konversi juga mendefinisikan metode byteArrayToLong() dan longToByteArray(). Dan, kita dapat menggunakan kedua metode ini untuk mengubah antara array byte dan nilai yang panjang

6. 2. Byte Array untuk mengapung dan menggandakan

Namun, kelas Konversi tidak secara langsung menyediakan metode yang sesuai untuk mengonversi nilai float atau double

Sekali lagi, kita memerlukan int perantara atau nilai panjang untuk mengubah antara array byte dan nilai float atau double

7. Kesimpulan

Pada artikel ini, kami mengilustrasikan berbagai cara untuk mengonversi larik byte menjadi nilai numerik menggunakan Java biasa melalui operator shift, ByteBuffer, dan BigInteger. Kemudian, kami melihat konversi yang sesuai menggunakan Guava dan Apache Commons Lang

Bagaimana cara mengubah string byte menjadi float Python?

Kita dapat mengonversi sebuah string menjadi float dengan Python menggunakan fungsi float() . Ini adalah fungsi bawaan yang digunakan untuk mengubah objek menjadi angka floating point. Secara internal, fungsi float() memanggil fungsi __float__() objek tertentu.

Bagaimana Anda mengonversi byte ke array dengan Python?

Python. fungsi bytearray() . Ini memberikan urutan bilangan bulat yang bisa berubah dalam kisaran 0

Bagaimana Anda bisa mengubah array byte menjadi string?

Ada dua cara untuk mengonversi array byte ke String. .
Dengan menggunakan konstruktor kelas String
Dengan menggunakan pengkodean UTF-8

Bagaimana cara mengubah byte ke int Python?

Sintaksis. int. from_bytes(byte, byteorder, *, ditandatangani=Salah)
Parameter
Mengembalikan – sebuah int yang setara dengan byte yang diberikan