2015-06-18 12 views
5

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#

+1

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

Trả lời

3

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()

+1

Cảm ơn nó đã làm việc – Orangelight

2

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

+1

Cảm ơn lời giải thích – Orangelight

Các vấn đề liên quan