Saya bertanya karena saya mengirim aliran byte dari proses C ke Java. Di sisi C, integer 32 bit memiliki LSB adalah byte pertama dan MSB adalah byte ke-4.
Jadi pertanyaan saya adalah: Di sisi Java ketika kita membaca byte seperti yang dikirim dari proses C, apa itu endian di sisi Java?
Pertanyaan lanjutan: Jika endian di sisi Java tidak sama dengan yang dikirim, bagaimana cara mengonversi di antara keduanya?
java
endianness
hhafez.dll
sumber
sumber
Jawaban:
Gunakan urutan byte jaringan (big endian), yang sama dengan yang digunakan Java. Lihat man htons untuk berbagai penerjemah dalam C.
sumber
Saya tersandung di sini melalui Google dan mendapat jawaban saya bahwa Java adalah big endian .
Membaca tanggapan saya ingin menunjukkan bahwa byte memang memiliki urutan endian, meskipun untungnya, jika Anda hanya berurusan dengan mikroprosesor "arus utama" Anda tidak mungkin pernah menemukannya seperti Intel, Motorola, dan Zilog semua menyetujui arah pergeseran chip UART mereka dan bahwa MSB byte akan
2**7
dan LSB akan berada2**0
di CPU mereka (saya menggunakan notasi daya FORTRAN untuk menekankan berapa umur barang ini :)).Saya mengalami masalah ini dengan beberapa data downlink serial bit Space Shuttle 20+ tahun yang lalu ketika kami mengganti perangkat keras antarmuka $ 10K dengan komputer Mac. Ada laporan singkat NASA Tech yang diterbitkan tentang itu sejak lama. Saya hanya menggunakan tabel pencarian elemen 256 dengan bit dibalik (
table[0x01]=0x80
dll.) Setelah setiap byte digeser dari aliran bit.sumber
Tidak ada bilangan bulat yang tidak bertanda tangan di Java. Semua bilangan bulat ditandatangani dan di big endian.
Sepertinya Anda menggunakan LSB sebagai Sedikit signifikan, bukan? LSB biasanya singkatan dari byte paling signifikan. Endianness tidak berbasis bit tetapi berbasis byte.
Untuk mengonversi dari byte unsigned menjadi integer Java:
Untuk mengonversi dari 32-bit little-endian unsigned dalam byte [] ke Java long (dari atas kepala saya, tidak diuji):
sumber
Tidak mungkin hal ini dapat memengaruhi apa pun di Java, karena tidak ada cara (non-API langsung) untuk memetakan beberapa byte secara langsung ke int di Java.
Setiap API yang melakukan ini atau sesuatu yang serupa mendefinisikan perilakunya dengan cukup tepat, jadi Anda harus mencari dokumentasi API tersebut.
sumber
Saya akan membaca byte satu per satu, dan menggabungkannya menjadi nilai yang panjang . Dengan cara itu Anda mengontrol endianness, dan proses komunikasinya transparan.
sumber
Jika sesuai dengan protokol yang Anda gunakan, pertimbangkan untuk menggunakan DataInputStream, di mana perilakunya didefinisikan dengan sangat baik .
sumber
Java adalah 'Big-endian' seperti disebutkan di atas. Itu berarti bahwa MSB dari sebuah int ada di sebelah kiri jika Anda memeriksa memori (setidaknya pada CPU Intel). Bit tanda juga ada di MSB untuk semua tipe integer Java.
Membaca 4 byte unsigned integer dari file biner yang disimpan oleh sistem 'Little-endian' membutuhkan sedikit adaptasi di Java. ReadInt () DataInputStream mengharapkan format Big-endian.
Berikut adalah contoh yang membaca nilai unsigned empat byte (seperti yang ditampilkan oleh HexEdit sebagai 01 00 00 00) menjadi bilangan bulat dengan nilai 1:
sumber
java force memang big endian: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11
sumber
byte[] bbb = ByteBuffer.allocate(4).putFloat(0.42f).array();
menghasilkanbyte
array yang merupakan kebalikan dari apa yang sayaC/C++
hasilkan. Oleh karena itu, pengaruh besar Java berlaku bahkan dalam data pada waktu proses.