2010-06-23 26 views
9

Necesito convertir 2 bytes (complemento de 2) en un int en código Java. ¿cómo lo hago?conversión de bytes a int en Java

 
toInt(byte hb, byte lb) 
{ 

} 
+0

qué quiere aplicar por sí mismo porque tiene una tarea específica por su profesor o algo? ¿O solo quieres usar la clase build-in-Java? – TheChange

+0

si la clase build-in-java tiene un método para convertir 2 bytes en un entero, claro, házmelo saber. – user121196

+2

posible duplicado de [Convertir 4 bytes a int] (http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int) – OscarRyz

Respuesta

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

operación correcta en todos los casos se deja como ejercicio para el estudiante.

+5

Esos moldes son redundantes. –

+1

Punto válido, a veces es más claro ser explícito. –

+1

Cabe señalar que esta solución solo funciona con una representación de entero corto con signo, y no será apropiada para decodificar encabezados TCP donde los puertos están representados en un formato sin firmar. –

0
public int toInt(byte hb, byte lb) 
{ 
    return ((int)hb)<<8 + lb; 
} 
+0

es esta respuesta la misma que la de theatrus? – user121196

+3

no, aparece la respuesta incorrecta cuando lb es negativo. – ILMTitan

+0

Editado la respuesta, la solución fue agregar paréntesis alrededor del operador <<, espero que se apruebe pronto y otros no pasarán un día depurando el código que usa este fragmento :) –

10

También puede utilizar la clase ByteBuffer:

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. 
} 

Esta clase podría ser útil si usted está decodificación de una gran cantidad de datos.

+0

Pero si los dos bytes están en 2 cumplido, ¿no haría eso el primer byte de hb el bit de signo? Entonces su 'nuevo byte [] {a, b, c, d}' sería 'a = hb & 0x80; b = 0; c = hb & 0x7F; d = lb; '? Podría estar fuera de la base aquí. – corsiKa

+0

Buen punto, el primer bit de 'hb' se debe tirar al lado izquierdo de' a', entonces mi solución probablemente no sea lo que está buscando. Solo quería señalar la clase ByteBuffer ... – maerics

+0

Use 'getShort' en lugar de' getInt'. Cuando convierte el 'corto' resultante en un 'int', se extenderá el signo dando el resultado correcto. – finnw

1

Uso:

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; 
    } 
}