8

I need to convert 2 bytes (2's complement) into an int in Java code. how do I do it?

toInt(byte hb, byte lb)
{

}
dreadwail
  • 15,098
  • 21
  • 65
  • 96
user121196
  • 30,032
  • 57
  • 148
  • 198
  • do you want to implement it by yourself because you have a specific task by your teacher or something? Or do you just want to use the build-in-Java class? – TheChange Jun 23 '10 at 20:51
  • if the build-in-java class has a method to convert 2 bytes into an integer, sure let me know. – user121196 Jun 23 '10 at 20:54
  • 2
    possible duplicate of [Convert 4 bytes to int ](http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int) – OscarRyz Jun 23 '10 at 20:56
  • 1
    Perhaps consider why you're passing around raw bytes? You might solve this problem easily by going to SO, but this is indicative of bigger problems. What is this int? Why must it be in bytes? What alternatives are there for persisting this data in another form? – corsiKa Jun 23 '10 at 21:05
  • @glowcoder: Its more common than you think. – Yann Ramin Jun 24 '10 at 05:48

5 Answers5

15
return ((int)hb << 8) | ((int)lb & 0xFF);

Correct operation in all cases is left as an exercise for the student.

Yann Ramin
  • 32,895
  • 3
  • 59
  • 82
11

You can also use the ByteBuffer class:

public int toInt(byte hb, byte lb) {
    ByteBuffer bb = ByteBuffer.wrap(new byte[] {hb, lb});
    return bb.getShort(); // Implicitly widened to an int per JVM spec.
}

This class might be helpful if you're decoding a lot of data.

maerics
  • 151,642
  • 46
  • 269
  • 291
  • But if the two bytes are in 2's compliment, wouldn't that make the first byte of hb the sign bit? So your `new byte[]{a,b,c,d}` would be `a= hb & 0x80; b=0; c= hb & 0x7F; d= lb;`? I could be off base here. – corsiKa Jun 23 '10 at 21:12
  • Good point, the first bit of `hb` should be pulled to the left-hand side of `a`, so my solution probably isn't what he's looking for. I just wanted to point out the ByteBuffer class... – maerics Jun 23 '10 at 21:44
  • Use `getShort` instead of `getInt`. When you cast the resulting `short` to an `int` it will be sign-extended giving the correct result. – finnw Jun 23 '10 at 22:27
  • @finnw: great idea, why didn't I think of that? =) – maerics Jun 24 '10 at 00:15
1

Usage:

public class Test {

    public static void main(String[] args) {
        byte[] b = new byte[] { -83, 0, 0, 0 };

        int i = GattUtils.getIntValue(b, GattUtils.FORMAT_UINT32, 0);

        System.out.println(i); //will print 173
    }


public class GattUtils {
    public static final long leastSigBits = 0x800000805f9b34fbL;

    public static final int FIRST_BITMASK = 0x01;
    public static final int SECOND_BITMASK = FIRST_BITMASK << 1;
    public static final int THIRD_BITMASK = FIRST_BITMASK << 2;
    public static final int FOURTH_BITMASK = FIRST_BITMASK << 3;
    public static final int FIFTH_BITMASK = FIRST_BITMASK << 4;
    public static final int SIXTH_BITMASK = FIRST_BITMASK << 5;
    public static final int SEVENTH_BITMASK = FIRST_BITMASK << 6;
    public static final int EIGTH_BITMASK = FIRST_BITMASK << 7;

    public static final int FORMAT_UINT8 = 17;
    public static final int FORMAT_UINT16 = 18;
    public static final int FORMAT_UINT32 = 20;
    public static final int FORMAT_SINT8 = 33;
    public static final int FORMAT_SINT16 = 34;
    public static final int FORMAT_SINT32 = 36;
    public static final int FORMAT_SFLOAT = 50;
    public static final int FORMAT_FLOAT = 52;

    public static UUID toUuid(String uuidString) {
        return UUID.fromString(uuidString);
    }

    public static UUID toUuid(long assignedNumber) {
        return new UUID((assignedNumber << 32) | 0x1000, leastSigBits);
    }

    public static String toUuid128(long assignedNumber) {
        return toUuid(assignedNumber).toString();
    }

    public static String toUuid16(int assignedNumber) {
        return Integer.toHexString(assignedNumber);
    }

    public static Integer getIntValue(byte[] value, int format, int position) {
        if (value == null)
            return null;
        if (position + (format & 0xF) > value.length)
            return null;
        switch (format) {
        case FORMAT_UINT8:
            return Integer.valueOf(value[position] & 0xFF);
        case FORMAT_UINT16:
            return Integer.valueOf(add(value[position], value[(position + 1)]));
        case FORMAT_UINT32:
            return Integer.valueOf(add(value[position], value[(position + 1)], value[(position + 2)], value[(position + 3)]));
        case FORMAT_SINT8:
            return Integer.valueOf(signed(value[position] & 0xFF, 8));
        case FORMAT_SINT16:
            return Integer.valueOf(signed(add(value[position], value[(position + 1)]), 16));
        case FORMAT_SINT32:
            return Integer.valueOf(signed(add(value[position], value[(position + 1)], value[(position + 2)], value[(position + 3)]), 32));
        }
        return null;
    }

    public static Float getFloatValue(byte[] value, int format, int position) {
        if (value == null)
            return null;
        if (position + (format & 0xF) > value.length)
            return null;
        int i;
        int mantissa;
        int exponent;
        switch (format) {
        case FORMAT_SFLOAT:
            i = value[(position + 1)];
            position = value[position];
            mantissa = signed((position & 0xFF) + ((i & 0xFF & 0xF) << 8), 12);
            exponent = signed((i & 0xFF) >> 4, 4);
            return Float.valueOf((float) (mantissa * Math.pow(10.0D, exponent)));
        case FORMAT_FLOAT:
            exponent = value[(position + 3)];
            mantissa = value[(position + 2)];
            i = value[(position + 1)];
            position = value[position];
            return Float.valueOf((float) ((format = signed((position & 0xFF) + ((i & 0xFF) << 8) + ((mantissa & 0xFF) << 16), 24)) * Math.pow(10.0D, exponent)));
        }
        return null;
    }

    public static String getStringValue(byte[] value, int position) {
        if (value == null)
            return null;
        if (position > value.length)
            return null;
        byte[] arrayOfByte = new byte[value.length - position];
        for (int i = 0; i != value.length - position; i++) {
            arrayOfByte[i] = value[(position + i)];
        }
        return new String(arrayOfByte);
    }

    private static int add(byte byte1, byte byte2) {
        return (byte1 & 0xFF) + ((byte2 & 0xFF) << 8);
    }

    private static int add(byte byte1, byte byte2, byte byte3, byte byte4) {
        return (byte1 & 0xFF) + ((byte2 & 0xFF) << 8) + ((byte3 & 0xFF) << 16) + ((byte4 & 0xFF) << 24);
    }

    private static int signed(int value, int length) {
        if ((value & 1 << length - 1) != 0)
            value = -1 * ((1 << length - 1) - (value & (1 << length - 1) - 1));
        return value;
    }

    /**
     * Convert hex byte array from motorola API to byte array.
     * 
     * @param hexByteArray
     * @return
     */
    public static byte[] hexByteArrayToByteArray(byte[] hexByteArray) {
        return hexStringToByteArray(new String(hexByteArray));
    }

    /**
     * Convert string from motorola API to a byte array.
     * 
     * @param hexString
     * @return
     */
    public static byte[] hexStringToByteArray(String hexString) {
        int len = hexString.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));
        }
        return data;
    }
}
AZ_
  • 21,688
  • 25
  • 143
  • 191
-1
public int toInt(byte hb, byte lb)
{
    return ((int)hb)<<8 + lb;
}
Bill the Lizard
  • 398,270
  • 210
  • 566
  • 880
luke
  • 14,518
  • 4
  • 46
  • 57
-1

For those of you who are looking for the Little Endian value:

int num = ByteBuffer.wrap(b, 0, 2).order(LITTLE_ENDIAN).char.toInt()
Oz Shabat
  • 1,434
  • 17
  • 16