Lire deux octets dans un entier?

J’ai un byte[] que j’ai lu dans un fichier et je veux obtenir un int partir de deux octets. Voici un exemple:

 byte[] bytes = new byte[] {(byte)0x00, (byte)0x2F, (byte)0x01, (byte)0x10, (byte)0x6F}; int value = bytes.getInt(2,4); //This method doesn't exist 

Cela devrait rendre la value égale à 0x0110 ou 272 en décimal. Mais évidemment, byte[].getInt() n’existe pas. Comment puis-je accomplir cette tâche?

Le tableau ci-dessus n’est qu’un exemple. Les valeurs réelles sont inconnues pour moi.

Vous devriez simplement opter pour le simple:

 int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff); 

Vous pourriez même écrire votre propre fonction d'aide getBytesAsWord (byte[] bytes, int start) pour vous donner la fonctionnalité si vous ne voulez pas que les calculs surviennent dans votre code, mais je pense que ce serait probablement exagéré.

Essayer:

 public static int getInt(byte[] arr, int off) { return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF; } // end of getInt 

Votre question n’indique pas ce que signifient les deux arguments (2,4). 2 et 4 n'ont aucun sens dans votre exemple en tant qu'indices dans le tableau pour trouver ox01 et 0x10, je suppose que vous vouliez prendre deux éléments consécutifs, une chose commune à faire, donc j'ai utilisé off + 1 dans ma méthode.

Vous ne pouvez pas étendre la classe byte [] dans java, vous ne pouvez donc pas avoir une méthode bytes.getInt, alors j'ai créé une méthode statique qui utilise l'octet [] comme premier argument.

Le "truc" de la méthode est que vos octets sont des entiers signés sur 8 bits et que les valeurs supérieures à 0x80 sont négatives et que le signe est étendu (c'est-à-dire 0xFFFFFF80 lorsqu'il est utilisé comme int). C'est pourquoi le masquage '& 0xFF' est nécessaire. le << << 8 décale l'octet le plus significatif de 8 bits restants. Le '|' combine les deux valeurs - tout comme le ferait «+». L'ordre des opérateurs est important car << a la plus haute priorité, suivi de & suivi de | - donc pas de parenthèses sont nécessaires.

Voici un moyen simple et fiable.

  ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4); // by choosing big endian, high order bytes must be put // to the buffer before low order bytes byteBuffer.order(ByteOrder.BIG_ENDIAN); // since ints are 4 bytes (32 bit), you need to put all 4, so put 0 // for the high order bytes byteBuffer.put((byte)0x00); byteBuffer.put((byte)0x00); byteBuffer.put((byte)0x01); byteBuffer.put((byte)0x10); byteBuffer.flip(); int result = byteBuffer.getInt(); 

Alternativement, vous pouvez utiliser:

 int val = (bytes[2] << 8) + bytes[3] 

Vous pouvez utiliser ByteBuffer. Il a la méthode getInt que vous recherchez et de nombreuses autres méthodes utiles

La classe Google Base16 provient de Guava-14.0.1.

 new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue();