Question

Je suis en train de retourner quelques octets autour de Java et la fonction je travaille correctement pour certains octets et à défaut pour les autres.

La fonction que je utilise est ceci:

public static int foldInByte(int m, int pos, byte b) {
    int tempInt = (b << (pos * 8));
    tempInt = tempInt & (0x000000ff << (pos * 8));
    m = m | tempInt;
    return m;
}

Et le code qui implémente ceci est:

byte[] bitMaskArray = new byte[]{
                            byteBuffer.get(inputIndex),
                            byteBuffer.get(inputIndex + 1),
                            byteBuffer.get(inputIndex + 2),
                            byteBuffer.get(inputIndex + 3)};
                        int tempInt = 0;

                        tempInt = foldInByte(0, 3, bitMaskArray[3]);
                        tempInt = foldInByte(tempInt, 2, bitMaskArray[2]);
                        tempInt = foldInByte(tempInt, 1, bitMaskArray[1]);
                        tempInt = foldInByte(tempInt, 0, bitMaskArray[0]);

                        bitMask = tempInt;

Les octets sont lus à partir d'un ByteBuffer avec le ordreOctet étant Little Endian.

Par exemple, les octets 00 01 B6 02 Réglez le Bitmask à:. 2B60100 - qui fonctionne parfaitement dans mon programme

Cependant, si les octets sont A0 01 30 00, le Bitmask est réglé sur:. 3001A0 - qui a stipped le dernier zéro du bitmask

Est-il possible que je peux arrêter Java à partir stipping de zéros?

J'espère que le sens de marques.

Merci

Tony

Était-ce utile?

La solution

Les zéros ne sont pas dépouillé -. Les deux exemples cités sont corrects

  • 00 01 B6 02 est le petit-boutiste 4 octets pour 2B60100
  • A0 01 30 00 est le petit-boutiste 4 octets pour 3001A0

Les zéros sont là, mais probablement pas en cours d'impression. La famille System.out.print des appels ne sera pas imprimer un zéro chiffres.

Je pourrais mentionner que votre méthode est inutilement complexe. Voici une seule méthode qui calcule la même valeur:

static int extractLittleEndian4(byte[] buf, int index)
{
    int a = buf[index+0]&0xff, b = buf[index+1]&0xff, c = buf[index+2]&0xff, d = buf[index+3]&0xff;
    return a | (b << 8) | (c << 16) | (d << 24);
}

Autres conseils

Il semble que vous avez un ByteBuffer rempli avec vos octets déjà. Pourquoi ne pas laisser le ByteBuffer inverser les octets pour vous? Il suffit d'ajouter les octets dans la mémoire tampon (BIG_ENDIAN est la valeur par défaut si vous souhaitez ajouter un entier au lieu d'octets), puis modifiez l'ordre avant de lire l'entier.

byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int output = byteBuffer.getInt(0);

Si tout ce que vous faites est d'inverser l'ordre des octets, laissez la bibliothèque faire le travail pour vous. Si vous arrivé à commencer par une valeur entière, vous pouvez même faire ceci:

int input = ...;
int output = Integer.reverseBytes(input);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top