Win a copy of Functional Reactive Programming this week in the Other Languages forum!

# Converting C# code in JAVA / datatype problem

Greenhorn
Posts: 21
Converting C# code in JAVA / datatype problem

In c# byte range is 0 to 255 and in JAVA -128 to 127.

Now I have C# byte array as {15, 0, 0, 128, 16, 39, 240, 216, 241, 255, 127}.

now First take C# scenario, they have two methods....

1. BitConverter.ToInt16(byteArray, index); // In C# Int16 is short range: -32768 to 32767
This method consider two bytes from index positions and convert them to short(Int16).
e.g. byteArray = {15, 0, 0, 128, 16, 39, 240, 216, 241, 255, 127} and index = 6.
then two bytes will be 240, 216. By using this two bytes it creates one short(Int16) which is -10000.

2. BitConverter.ToInt32(byteArray, index); // In C# Int32 is int range: -2147483648 to 2147483647
This method consider four bytes from index positions and convert them to int(Int32).
e.g. byteArray = {15, 0, 0, 128, 16, 39, 240, 216, 241, 255, 127} and index = 6.
then four bytes will be 240, 216, 241, 255. By using this four bytes it creates one int(Int32) which is -927504.

Now In JAVA

As java byte range is -128 to 127 we have to use short array to store same data.
i took {15, 0, 0, 128, 16, 39, 240, 216, 241, 255, 127} as short Array.
converted it to byteArray = {0, 15, 0, 0, 0, 0, 0, -128, 0, 16, 0, 39, 0, -16, 0, -40, 0, -15, 0, -1, 0, 127}

1. to get short (range: -32768 to 32767)
i took index = 6*2 = 12
so the byte i have to consider are 0, -16, 0, -40.
and have to make one short from it but these are 4 bytes, How can i make short from it!!! so i took resulting number as int which is of 4 byte length.
Now problem is int range in java is -2147483648 to 2147483647, so while making the number from those byte array its not giving same result as C#

2. to get int (range: -2147483648 to 2147483647)
i took index = 6*2 = 12
so the byte i have to consider are 0, -16, 0, -40, 0, -15, 0, -1.
and have to make one int from it but these are 8 bytes, How can i make int from it? same problem above now for int, so i consider resulting number as long.
Same now, the java long range (-9223372036854775808 to +9223372036854775807) is different than C# int range(-2147483648 to 2147483647).
So the resulting number getting from byte array is not same as the C# output.
I used,

like wise i have tried in different way... also succeed in getting short, int and long number but the values, i.e. my output is not same as C#

Steve Luke
Bartender
Posts: 4181
22
Roshan Wankhade wrote:[As java byte range is -128 to 127 we have to use short array to store same data.

No, you don't. You should still store the values as bytes. Your bit converter cares only about the bits as data, not the value. The bits for the byte -1 is the same as the (bottom 8) bits for short 255 (and for the byte -128 and short 128). You need these bits to be correct to build the shorts and ints, not the original byte values. So you should not convert the bytes to shorts.

You might also choose to use a ByteBuffer. You can put the raw bytes into that, convert to the corresponding data type buffer (ShortBuffer, IntBuffer, LongBuffer, etc...) and then pull the values out. This would also help you fix the endian-ness of the data if you need to.

It has been my experience when converting code from one language to another to not attempt a line-by-line or expression-by-expression conversion. Rather, you need to be able to read the constructs in source language and understand its intent. Then find the appriate means of executing that intent in the target language. This generally makes better code and fewer work-arounds and bugs as you try to implement things that just don't translate.