web-dev-qa-db-fra.com

Conversion des valeurs de tableau d'octets dans un ordre peu final en valeurs courtes

J'ai un tableau d'octets où les données dans le tableau sont en réalité des données courtes. Les octets sont classés en little endian:

3, 1, -48, 0, -15, 0, 36, 1

Ce qui, une fois converti en valeurs courtes, a pour résultat:

259, 208, 241, 292

Existe-t-il un moyen simple en Java de convertir les valeurs d'octet en leurs valeurs courtes correspondantes? Je peux écrire une boucle qui prend juste chaque octet de poids fort et la décale de 8 bits et OR avec son octet de poids faible, mais cela a un impact négatif sur les performances.

20
AndroidDev

Avec Java.nio.ByteBuffer vous pouvez spécifier l’endianité souhaitée: order () .

ByteBuffer propose des méthodes pour extraire des données sous forme d'octet, de caractère, getShort () , getInt () , long, double ...

Voici un exemple d'utilisation:

ByteBuffer bb = ByteBuffer.wrap(byteArray);
bb.order( ByteOrder.LITTLE_ENDIAN);
while( bb.hasRemaining()) {
   short v = bb.getShort();
   /* Do something with v... */
}
44
Aubin
 /* Try this: */
public static short byteArrayToShortLE(final byte[] b, final int offset) 
{
        short value = 0;
        for (int i = 0; i < 2; i++) 
        {
            value |= (b[i + offset] & 0x000000FF) << (i * 8);
        }            

        return value;
 }

 /* if you prefer... */
 public static int byteArrayToIntLE(final byte[] b, final int offset) 
 {
        int value = 0;

        for (int i = 0; i < 4; i++) 
        {
           value |= ((int)b[i + offset] & 0x000000FF) << (i * 8);
        }

       return value;
 }
0
Patrick Paulin