Alexander Ciesielski
Alexander Ciesielski

Reputation: 10834

Convert 3 bytes array to number

I convert a short number to a 3 byte array using the following code:

static byte[] convertTo3ByteArray(short s) {

   byte[] ret = new byte[3];
   ret[0] = (byte) (s & 0xff);
   ret[1] = (byte) ((s >> 8) & 0xff);
   ret[2] = (byte) (0x00);

   return ret;
}

This works very well.

I found a code on Stackoverflow to convert the array back to a number:

static int convertToInt(byte[] b) {
   return ((b[0] << 0) | (b[1] << 8) | (b[2] << 16));
}

And when I convert 258 to byte array, and then use this code, it returns 258.

But for number 675, this code returns -93.

How do I have to change the convertToShort method to get 675 back? I suppose it has something to do with bitshift and loss of data? Or signed bytes?

Upvotes: 3

Views: 1564

Answers (3)

Lyndon Armitage
Lyndon Armitage

Reputation: 452

Changing to using a char datatype will fix this issue as they are the only unsigned type in Java:

https://stackoverflow.com/a/21089624/1590490

static char[] convertTo3ByteArray(short s) {

    char[] ret = new char[3];
    ret[0] = (char) (s & 0xff);
    ret[1] = (char) ((s >> 8) & 0xff);
    ret[2] = (char) (0x00);

    return ret;
}

static int convertToShort(char[] b) {
    return ((b[0]) | (b[1] << 8) | (b[2] << 16)); // the original << 0 shift does nothing
}

Upvotes: 1

The Guy with The Hat
The Guy with The Hat

Reputation: 11132

A short has 16 bits of information, so that would be two bytes. When you try to store a third byte with | (b[2] << 16), it would go off the end of the short's bits, which is a problem. I.e. you can't do what you want to.

Upvotes: 1

morgano
morgano

Reputation: 17422

Try with this modified method:

static int convertToShort(byte[] b) {
    return (((b[0] & 0xFF) << 0) | ((b[1] & 0xFF) << 8) | ((b[2] & 0xFF) << 16));
}

In the array some bytes are negative, you need to convert them back to "positive values" with byteVal & 0xFF before doing the bit shift

Upvotes: 4

Related Questions