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.

1 Answer 1

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.

Sign up to request clarification or add additional context in comments.

4 Comments

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)
I think now the output will be -106, 32, 0, 0
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: -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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.