views:

228

answers:

1

Hello!

This is strange to me: when I run in Java

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

result is 3645145936617393160

when I run in 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();

result is 634032980358633010

Can you help me to understand this?
Thanks!

+7  A: 

This is a difference in endianness.

If you reverse the byte array, it works as expected:

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

You can set the endianness in Java by calling bb.order(ByteOrder.LITTLE_ENDIAN).

By the way, the easiest way to play with these things is to use LINQPad.

SLaks
Specifically, Java stores things internally as Big Endian, while x86 processors are Little Endian... and presumably .NET's design reflects this.
R. Bemrose
Thanks, it's great!
Max Gontar