Pertanyaan Mengirim dua kali dengan tcp dari java ke C #


Saya memiliki Java SocketServer yang mengirim ganda ke klien C #. Pemutusan mengirim ganda dengan DataOutputStream.writeDouble() dan klien membaca ganda dengan BinaryReader.ReadDouble(). Ketika saya mengirim dos.writeDouble(0.123456789); dan menyiramnya dari server klien membaca dan menghasilkan 3.1463026401691E + 151 yang berbeda dari yang saya kirim. Apakah C # dan Java menggandakan masing-masing dikodekan secara berbeda?


5
2018-06-18 00:39


asal


Jawaban:


Di Jawa, DataOutputStream.writeDouble() mengkonversi ganda ke panjang sebelum mengirim, menulisnya byte Tinggi pertama (Big endian).

Namun, C #, BinaryReader.ReadDouble() dibaca dalam Format Little Endian.

Dengan kata lain: Urutan byte berbeda, dan mengubah salah satunya harus memperbaiki masalah Anda.

Cara termudah untuk mengubah urutan byte di Java dari Big ke Little Endian adalah dengan menggunakan ByteBuffer, di mana Anda dapat menentukan jenis endian: misalnya:

ByteBuffer buffer = ByteBuffer.allocate(yourvaluehere); 
buffer.order(ByteOrder.LITTLE_ENDIAN); 
// add stuff to the buffer
byte[] bytes = buffer.array();

Kemudian, gunakan DataOutputStream.write()


3
2018-06-18 00:58



Masalahnya sebenarnya dengan pengkodean, khususnya endianness. Java menggunakan format big endian, yang merupakan standar jaringan standar, sedangkan klien C # Anda menggunakan format kecil endian.

Jadi inilah yang terjadi: 0.123456789 disimpan dalam format presisi IEEE754 Ganda sebagai 0x3FBF9ADD3739635F. Ketika ini dibaca dalam C #, urutan byte diganti, sehingga disimpan sebagai 0x5F633937DD9ABF3F. Ini sesuai dengan angka desimal 3.14630264016909969143315814746e151.

Melihat ini mencari tahu tentang membalik urutan byte di sisi klien C #


2
2018-06-18 01:05