2010-02-18 38 views
8

Đây là xa lạ với tôi: khi tôi chạy trong JavaJava và C# - byte mảng chênh lệch chuyển đổi dài

byte[] data = new byte[] { 50, -106, 40, -22, -94, -119, -52, 8 }; 
ByteBuffer bb = ByteBuffer.wrap(data); 
System.out.println(bb.getLong()); 

kết quả là 3645145936617393160

khi tôi chạy trong C#

//unsigned values (signed&0xff) 
byte[] bytes = new byte[] { 50, 150, 40, 234, 162, 137, 204, 8 }; 
long l = BitConverter.ToInt64(bytes, 0); 
System.Console.Write(String.Format("{0}\n", l)); 
System.Console.ReadKey(); 

kết quả là 634032980358633010

Bạn có thể giúp tôi hiểu điều này không?
Cảm ơn!

Trả lời

12

Đây là sự khác biệt trong endianness.

Nếu bạn đảo ngược mảng byte, nó hoạt động như mong đợi:

BitConverter.ToInt64(new byte[] { 8, 204, 137, 162, 234, 40, 150, 50 }, 0) 

Bạn có thể thiết lập các endianness trong Java bằng cách gọi bb.order(ByteOrder.LITTLE_ENDIAN).

Nhân tiện, cách dễ nhất để chơi với những thứ này là sử dụng LINQPad.

+2

Cụ thể, Java lưu trữ nội bộ như Big Endian, trong khi bộ vi xử lý x86 là Little Endian ... và có lẽ thiết kế của .NET phản ánh điều này. – Powerlord

+0

Cảm ơn, rất tuyệt! –

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