Question

I ont un problème avec la conversion des valeurs brutes-octets dans les types Java. Je reçois octets par un socket datagramme comme une matrice de bytes. Je sais exactement quels moyens octets quoi, mais je ne sais pas comment les convertir correctement (je veux dire que je sais des compensations, mais je ne sais pas si ce que je pense que je reçu est correct;).)

Par exemple, je veux convertir court 16 bits non signé dans le type int java. J'ai trouvé quelques exemples dans le web, l'un est:

public int getUShort(byte[] bytes, int offset) {
    int b0 = bytes[offset] & oxFF;
    int b1 = bytes[offset + 1] & oxFF;

    return (b1 << 8) + (b0 << 0);

Un autre est le même, mais la dernière ligne est:

return (b0 << 8)  + b1;

Bien sûr, il donne des résultats différents. Laquelle est correcte? Pouvez-vous s'il vous plaît me donner aussi un exemple valide comment faire la même chose mais pour un long non signé?

Merci d'avance!

Était-ce utile?

La solution

Vous pouvez utiliser DataInputStream ou ByteBuffer pour lire les différents types. Vous pouvez utiliser des types signés en tant que valeurs non signées pour la plupart des opérations de la même facon. J'ai écrit une classe simple pour illustrer comment vous pouvez utiliser les types signés comme si elles étaient non signées Unsigned

ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();

Autres conseils

Je devais faire un travail semblable à celui d'un certain temps et je trouve que la meilleure façon de faire ce genre de travail est d'utiliser ByteBuffer et ses conversions à DoubleBuffer, LongBuffer, etc. Vous pouvez convertir un tableau d'octets en un ByteBuffer en appelant

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

A partir de là, vous pouvez obtenir une vue des octets comme une liste de ints en appelant

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

et vous pouvez ensuite convertir les octets en appelant

int nextInt = myIntBuffer.get();

Ces classes ont aussi beaucoup de soutien pour les opérations en vrac, ainsi si vous savez pertinemment que vous recevez un tas de données du même type sur le réseau que vous pouvez faire les conversions très rapidement.

Une autre approche serait, si possible, d'utiliser une sorte de sérialisation Java pour envoyer les données sur le réseau. Cela vous permet d'effectuer les conversions beaucoup plus facilement en utilisant les classes d'écrivain de flux. Bien sûr, cela pourrait ne pas être disponible, surtout si vous communiquez avec un serveur non-Java, mais il pourrait être utile d'explorer.

vraiment en retard sur celui-ci.

Les deux sont corrects sur la base endianess des données. Voir ici: http://en.wikipedia.org/wiki/Endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top