Tôi có một Java SocketServer gửi gấp đôi cho một khách hàng C#. Máy chủ sẽ gửi đôi với DataOutputStream.writeDouble()
và khách hàng đọc số đôi với BinaryReader.ReadDouble()
. Khi tôi gửi dos.writeDouble(0.123456789);
và xóa nó khỏi máy chủ, khách hàng đọc và xuất ra 3.1463026401691E + 151 khác với những gì tôi đã gửi. C# và Java có tăng gấp đôi mỗi mã được mã hóa khác nhau không?Gửi gấp đôi với tcp từ java đến C#
Trả lời
Trong Java, DataOutputStream.writeDouble()
chuyển đổi gấp đôi thành dài trước khi gửi, viết nó byte cao đầu tiên (Big endian).
Tuy nhiên, C#, BinaryReader.ReadDouble()
đọc ở định dạng Little Endian.
Nói cách khác: Thứ tự byte khác nhau và việc thay đổi một trong số chúng sẽ khắc phục được sự cố của bạn.
Cách dễ nhất để thay đổi thứ tự byte trong Java từ Big Little Endian là sử dụng một ByteBuffer, nơi bạn có thể xác định loại endian: ví dụ:
ByteBuffer buffer = ByteBuffer.allocate(yourvaluehere);
buffer.order(ByteOrder.LITTLE_ENDIAN);
// add stuff to the buffer
byte[] bytes = buffer.array();
Sau đó, sử DataOutputStream.write()
Cảm ơn nó đã làm việc – Orangelight
Các vấn đề trên thực tế với mã hóa, cụ thể là endianness. Java sử dụng định dạng cuối cùng lớn, đó là độ tin cậy mạng chuẩn, trong khi máy khách C# của bạn đang sử dụng định dạng cuối cùng nhỏ.
Vì vậy, đây là những gì đã xảy ra: 0.123456789
được lưu trữ ở định dạng chính xác kép IEEE754 là 0x3FBF9ADD3739635F
. Khi điều này được đọc trong C#, thứ tự byte được chuyển đổi, vì vậy nó được lưu trữ như 0x5F633937DD9ABF3F
. Điều này tương ứng với số thập phân 3.14630264016909969143315814746e151
.
Hãy xem this questing để xem về đảo ngược thứ tự byte trên C# client bên
Cảm ơn lời giải thích – Orangelight
- 1. dài gấp đôi so với đôi
- 2. Java float chính xác hơn gấp đôi?
- 3. mảng loại tăng gấp đôi trong C
- 4. C++ đúc tĩnh hai chiều mảng đôi tăng gấp đôi **
- 5. Nhận chuỗi từ giá trị gấp đôi lớn (C#)
- 6. Trả lại C++ gấp đôi cho Python?
- 7. Chuỗi C++ để chuyển đổi gấp đôi
- 8. Nếu (gấp đôi) hợp lệ C++?
- 9. Được tăng gấp đôi so với phao nổi trong C#?
- 10. Chuyển đổi gấp đôi thành chuỗi C++?
- 11. C# vấn đề chính xác gấp đôi
- 12. Không thể chuyển đổi từ đôi [] [] để tăng gấp đôi [*, *]
- 13. Tại sao (gấp đôi) 0.6f> (gấp đôi) (6/10f)?
- 14. gửi nhiều tin nhắn từ máy chủ TCP đến máy khách (C sharp tới Android)
- 15. chuyển đổi jdouble thành gấp đôi loại c
- 16. chuyển đổi gấp đôi lên số nguyên trong java
- 17. Độ mất chính xác chuyển đổi từ lâu đến gấp đôi là bao nhiêu?
- 18. Java 8 Lambda để chuyển đổi Số [] [] thành gấp đôi [] []
- 19. Safe char punning * để tăng gấp đôi trong C
- 20. Tại sao Math.ceil trả lại gấp đôi?
- 21. Chuyển đổi gấp đôi thành void * trong C
- 22. Gửi tệp đến Cổng động theo Giao thức TCP
- 23. lợi nhuận gấp đôi dài và ctypes
- 24. tạo số ngẫu nhiên gấp đôi trong C++
- 25. C++ - Cách truyền chính xác gấp đôi thành int
- 26. Tại sao đôi khi HALF_UP tròn xuống gấp đôi?
- 27. Thay đổi Cột trong MySQL từ int thành gấp đôi?
- 28. Điều gì lớn hơn gấp đôi?
- 29. Chuyển đổi gấp đôi thành char * trong C++ với hiệu suất cao
- 30. Tăng gấp đôi bộ đệm trong Java trên Android với canvas và surfaceview
Cả hai nên IEEE754, nhưng thứ tự byte có thể khác nhau. Tôi không chắc chắn về C# mặc dù. – hexafraction