5

I am trying to send data from a java client to a c# server and having trouble converting int to byte array.

when i am converting the number 8342 with c# using this code:

BitConverter.GetBytes(8342)

the result is: x[4] = { 150, 32, 0, 0 }

with java i use:

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

and here the result is: x[4] = { 0, 0, 32, -106 }

Can someone explain? I am new to java and this is the first time i see negative numbers in byte arrays.

BoltClock
  • 700,868
  • 160
  • 1,392
  • 1,356
Idan
  • 2,819
  • 4
  • 33
  • 61

1 Answers1

9

You have to change endianess:

 bb.order(ByteOrder.LITTLE_ENDIAN)

Java stores things internally as Big Endian, while .NET is Little Endian by default.

Also there is difference in signed and unsigned between Java and .NET. Java uses signed bytes, C# uses unsigned. You will have to change that as well.

Basically, that is why you are seeing -106 ( 150 - 256 )

You will have to do something like the utility method below:

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

Note that value is long.

manojlds
  • 290,304
  • 63
  • 469
  • 417
  • Well ByteBuffer is documented (so reading the jdoc would've helped) to use BigEndian as default, but that's actually an interesting question, does Java define the used ByteOrder? I doubt it - would be a much to high performance hit and not noticeable anyways (except when writing output and we can convert it there easily according to the documentation) – Voo May 07 '11 at 00:08
  • I think now the output will be -106, 32, 0, 0 – Bala R May 07 '11 at 00:09
  • After the added line: ByteOrder.LITTLE_ENDIAN the array really changed it's orders. For the c# server to understand it i need to change the byte array to be unsigned. Is there a way to tell the ByteBuffer to do that or i need to change each byte? – Idan May 07 '11 at 11:01
  • 1
    @idan: -106 and 150 are *the same* byte; they just convert differently to strings or larger integers. Since Java doesn't have a way to represent unsigned bytes, there's no way to represent 150 as a byte in Java. – Gabe May 07 '11 at 11:54