Java Convertir 4 octets en int
je me demandais si la solution de cette documenté ici est toujours la solution ou est-il un autre moyen d'obtenir un entier de 4 octets?
merci.
EDIT: im obtenir le byte[] à partir de sockets .lire
EDIT: int recvMsgSize = in.read(Data, 0, BufferSize);
si recvMsgSize est -1 je sais que la connexion a été abandonnée.
comment puis-je détecter ce quand im en utilisant DataInputStream au lieu de InputStream?
grâce.
EDIT: toutes mes excuses pour être un yoyo par rapport à l'acceptation du droit de réponse. mais après mihi à jour de réponse définitive, il apparaît que la méthode est solide et réduit l'étendue de codage et à mon avis les meilleures pratiques.
source d'informationauteur iTEgg
Vous devez vous connecter pour publier un commentaire.
Selon l'endroit où vous obtenez ces 4 octets à partir de:
http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#readInt()
http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#getInt(int)
Bien sûr, vous pouvez toujours le faire manuellement, mais dans la plupart des cas à l'aide de l'un de ceux-là (si vous devez le convertir en un tableau d'octets avec beaucoup d'octets, vous pourriez vouloir utiliser un
DataInputStream
autour d'unByteArrayInputStream
par exemple) est plus facile.Modifier: Si vous avez besoin de changer l'endianness, vous devrez utiliser un ByteBuffer, ou d'inverser les octets de vous-même, ou de faire la conversion vous-même, comme DataInput ne prend pas en charge la modification de l'endianness.
Edit2: Quand vous les obtenez à partir de la prise de flux d'entrée, j'avais écharpe que l'on dans un
DataInputStream
et de l'utiliser pour la lecture des données de toutes sortes. Surtout depuis InputStream.read(byte[]) ne garantit pas à remplir tout le tableau d'octets... DataInputStream.readFully.Edit3: Lors de la lecture plusieurs fois à partir d'un flux, ils vont continuer la lecture là où vous vous êtes arrêté, j'. e. aByte sera octet 0, unint sera octets 1 à 4, anotherInt sera octets 5 à 8, etc. readFully va lire sur après tout que et bloquera jusqu'à ce qu'il a lu
lotOfbytes
.Lorsque le flux s'arrête (la connexion tombe), vous obtiendrez
EOFException
au lieu de -1, donc, si vous obtenez -1, l'int a vraiment -1.Si vous ne souhaitez pas analyser tous les octets à tous, vous pouvez sauter (). L'analyse d'un octet de 2 façons différentes n'est pas possible avec DataInputStream (j'. e. lire d'abord un int à partir de l'octet de 0 à 3, puis un à partir de l'octet 2 à 5), mais généralement pas nécessaire.
Exemple:
Espère que cela répond à vos questions supplémentaires.
Vous devez être très prudent avec toute l'élargissement de la conversion et numérique de la promotion, mais le code ci-dessous convertit 4
byte
enint
:Voir aussi
& 0xFF
-- vous finirez probablement faire beaucoup de ce que si vous travaillez avecbyte
depuis toutes les opérations arithmétiques de promouvoir desint
(oulong
)Si vous les avez déjà dans un
byte[]
tableau, vous pouvez utiliser:ou, si vous avez Google goyave-bibliothèques sur votre classpath, vous avez le raccourci:
qui a l'avantage que vous avez de même agréable Api pour les autres types (
Longs.fromByteArray
Shorts.fromByteArray
etc).Une solution dans le style fonctionnel (juste pour la variété, à mon humble avis pas très pratique à utiliser):
Comme mihi dit, ça dépend où vous êtes l'obtention de ces octets à partir, mais ce code peut être d'utilisation: