ByteBuffer getInt() question
Nous sommes à l'aide de Java ByteBuffer pour la socket de communication avec un serveur C++. Nous savons que Java est Big-endian et de la communication par Socket est également Big-endian. Donc, chaque fois que le flux d'octets reçus et les mettre dans un ByteBuffer en Java, nous appelons getInt() pour obtenir la valeur. Pas de problème, pas de conversion.
Mais si d'une certaine façon nous avons spécifiquement l'ByteBuffer ordre des octets pour Little-endian (mon collègue l'a fait),
- sera la Java convertir automatiquement le Big-endian dans le Little-endian lorsque les données sont placées dans le ByteBuffer?
- Puis le getInt() de la Little-endian version sera de retour une valeur de droite pour vous?
Je suppose que la réponse aux deux questions est oui. Mais quand j'ai essayer de vérifier mes devinettes et essayer de trouver comment le getInt() fonctionne de ByteBuffer, j'ai trouvé que c'est une méthode abstraite. La seule sous-classe de ByteBuffer est le MappedByteBuffer classe qui ne fait pas de mettre en œuvre le résumé getInt(). Mais où est donc la mise en œuvre de la getInt() la méthode?
Pour l'envoi, parce que nous sommes à l'aide de Little-endian ByteBuffer, nous avons besoin de les convertir dans un Big-endian octets avant de nous mettre sur la socket.
Qu'entendez-vous par socket de communication? l'infra, qu'est TCP/UDP...etc est en big endian, mais les données que vous envoyez dépend de la façon dont vous le mettez et sur la plate-forme.
Vous avez plus de 40 questions accepté de répondre. Peut-être vous pouvez suivre les réponses de sorte qu'ils peuvent être acceptés.
"J'imagine que la réponse aux deux questions est oui.' Difficile de voir pourquoi l'installation devrait être fourni dans le cas contraire.
OriginalL'auteur 5YrsLaterDBA | 2011-08-04
Vous devez vous connecter pour publier un commentaire.
ByteBuffer est en effet une classe abstraite. Il y a plusieurs façons dans lequel les octets tampons peuvent être créés:
allouer
;wrap
;allocateDirect
.Dans mon JDK, ces créer des instances de classes internes
HeapByteBuffer
etDirectByteBuffer
. Leurs respectifsgetInt
fonctions sont comme suit:et
Ci-dessus,
nativeByteOrder
etbigEndian
sont deux booléens membres indiquant respectivement-et quelque peu redondante -- si la configuration de l'ordre des octets de: (a) correspond à l'native de l'octet de commande; (b) est en big endian.OriginalL'auteur NPE
ByteBuffer utilisera automatiquement l'ordre des octets que vous spécifiez. (Ou Big endian par défaut)
À la fois directe et tas ByteBuffers re-octets comme vous le spécifier.
OriginalL'auteur Peter Lawrey