8

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!

Maksym Gontar
  • 22,765
  • 10
  • 78
  • 114

1 Answers1

12

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
  • 868,454
  • 176
  • 1,908
  • 1,964
  • 2
    Specifically, Java stores things internally as Big Endian, while x86 processors are Little Endian... and presumably .NET's design reflects this. – Powerlord Feb 18 '10 at 14:54