2011-05-06 13 views
5

Estoy tratando de enviar datos desde un cliente java a un servidor C# y tener problemas para convertir int a byte array.diferentes resultados al convertir int a byte array - .NET vs Java

cuando estoy convertir el número 8342 con C# utilizando este código:

BitConverter.GetBytes(8342) 

el resultado es: x [4] = {150, 32, 0, 0}

con java i uso :

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.putInt(8342); 
return bb.array(); 

y aquí el resultado es: x [4] = {0, 0, 32, -106}

puede alguien explicar? Soy nuevo en Java y esta es la primera vez que veo números negativos en matrices de bytes.

Respuesta

9

usted tiene que cambiar endianess:

bb.order(ByteOrder.LITTLE_ENDIAN) 

Java almacena cosas internamente como Big Endian, mientras que .NET es Little Endian por defecto.

También hay una diferencia en firmar y sin firmar entre Java y .NET. Java usa bytes firmados, C# usa unsigned. Tendrás que cambiar eso también.

Básicamente, es por eso que está viendo -106 (150 - 256)

Usted tendrá que hacer algo así como el método de utilidad a continuación:

public static void putUnsignedInt (ByteBuffer bb, long value) 
    { 
     bb.putInt ((int)(value & 0xffffffffL)); 
    } 

Tenga en cuenta que el valor es largo.

+0

Well ByteBuffer está documentado (por lo que la lectura del jdoc hubiera sido útil) para usar BigEndian como valor predeterminado, pero esa es en realidad una pregunta interesante, ¿define Java el ByteOrder utilizado? Lo dudo, sería un golpe de mucho a alto rendimiento y no se nota de todos modos (excepto cuando se escribe salida y podemos convertirlo fácilmente según la documentación) – Voo

+0

Creo que ahora la salida será -106, 32, 0, 0 –

+0

@Bala R - Punto agregado en – manojlds