2010-02-18 6 views
8

Questo è strano per me: quando corro in JavaJava e C# - array di byte a differenza lungo la conversione

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

risultato è 3645145936617393160

quando corro 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(); 

risultato è 634032980358633010

Potete aiutarmi a capire questo?
Grazie!

risposta

12

Si tratta di una differenza di endianness.

Se si inverte l'array di byte, esso funziona come previsto:

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

È possibile impostare l'endianness in Java chiamando bb.order(ByteOrder.LITTLE_ENDIAN).

Tra l'altro, il modo più semplice per giocare con queste cose è quello di utilizzare LINQPad.

+2

In particolare, negozi Java cose internamente come Big Endian, mentre i processori x86 sono little endian ... e presumibilmente il design di .NET riflette questo. – Powerlord

+0

Grazie, è grandioso! –

Problemi correlati