2009-07-08 8 views
0

Merci pour toutes les réponses ci-dessus, mais n'a pas vraiment m'aider juste pour donner une idée de ce que je veux faire exactement: Je code pour une sorte de paquet qui a différents champs avec longueur différente en octetsOctets en Java?

ainsi field1 est 2 octets long field2 est 3 octets long field3 est 6 octets de long et quand j'ajoute ces champs, je devrais obtenir 11 octets de longueur ...

Mais je ne sais pas comment puis-je déclarer quelque chose avec cet octet long ...

Veuillez nous aider ... merci d'avance

+0

Par "toutes les réponses ci-dessus" il signifie des réponses sur http://stackoverflow.com/questions/1098097/how-can-i-assign-2-bytes-to-a-variable-in-java –

+0

Cela ne devrait pas être sa propre question; Allez modifier l'original http://stackoverflow.com/questions/1098097 à la place. Pour ce faire, vous devez vous connecter avec le même compte que vous avez utilisé pour créer l'autre question (actuellement, vous êtes partagé entre les ID utilisateur 134939 et 135155), voir http://stackoverflow.com/questions/53598 si vous avez besoin d'aide pour cette. – ephemient

+0

Vous voudrez probablement changer le nom de cette question en quelque chose comme "Concevoir un protocole au niveau des octets en Java". Idk ... "Octets en Java?" est vraiment mauvais cependant. – Tom

Répondre

5

Utilisez un tableau:

byte[] byteArray = new byte[11]; 
+0

Je connaissais déjà la primitive octet, mais en y pensant maintenant, je me demande si nous pourrions l'utiliser pour implémenter une classe uint ... – bgw

2

Comment est sur:

byte[] arr = new byte[11]; 
0

J'ai trouvé que java.nio.ByteBuffer est généralement meilleur pour ce genre de chose. Il a de bonnes méthodes pour traiter l'interprétation des octets dans le tampon. Les documents sont here.

import java.nio.ByteBuffer; 

ByteBuffer buffer = ByteBuffer.allocate(11); 

Vérifiez les docs et regarder les belles méthodes telles que getInt() et getChar().

+0

Aussi, avant de faire votre propre protocole et d'analyser et interpréter cela, vous pouvez voulez vérifier quelque chose comme les tampons de protocole de Google: http://code.google.com/apis/protocolbuffers/docs/overview.html. On dirait qu'ils pourraient faire le travail et le code pour le traitement des messages de protocole pourrait être moins lourd. Il ajoute plus de dépendances dans votre code et autres (il y a un compilateur de tampon de protocole que vous devrez invoquer), mais je les trouve faciles à utiliser :-). – Tom

0

Java a une collection limitée de types primitifs, qui ont tous une taille fixe. Vous pouvez voir une liste d'entre eux here. Cela signifie que vous ne pouvez pas décider du nombre d'octets de votre variable. Comme d'autres l'ont déjà mentionné, vous pouvez toujours créer un new byte[11]. Notez que Java byte est signé, cependant. Il va de -128 à 127, pas de 0 à 255.

1

Vous pouvez utiliser une classe pour représenter votre paquet:

public class Packet 
{ 
    public byte[] Field1, Field2, Field3; 

    public Packet(byte[] packetBytes) 
    { 
     ByteBuffer packet = ByteBuffer.wrap(packetBytes); 
     Field1 = new byte[2]; 
     Field2 = new byte[3]; 
     Field3 = new byte[6]; 
     packet.get(Field1, 0, 2); 
     packet.get(Field2, 2, 3); 
     packet.get(Field3, 5, 6); 
    } 
} 

ByteBuffer est bon pour octet manipulation.

+1

D'abord ... ai-je raté quelque chose ... "struct" en java ?? De plus, ne manipulez-vous pas mieux le ByteBuffer actuel et créez-vous une classe wrapper? Au lieu d'utiliser get() et de remplir des tableaux d'octets, vous pouvez utiliser packet.getInt(); packet.getChar(); etc etc pour tous les types sont imbriqués dans le paquet. – Tom

+0

whoops - J'ai commencé à répondre en C# - puis je suis passé en Java. –

0

Je recommande les classes d'utilitaires au Javolution pour traiter les flux de protocoles binaires tels que celui-ci. Ils m'ont été utiles à plusieurs reprises pour traiter des flux binaires de bas niveau.

0

Vous devriez probablement concevoir votre code pour séparer le message que vous voulez manipuler dans Java du format de niveau de fil dont vous avez besoin de lire/écrire.

par exemple. Si vous avez un concept screenresolution, vous pouvez le représenter en Java avec une classe screenresolution:

public class ScreenResolution { 
    public int height; 
    public int width; 
} 

Cette classe est facile de travailler avec Java. Transformer ceci en un paquet qui peut être transmis sur un réseau/enregistré dans un fichier, etc. selon un format de fichier ou un protocole est une autre préoccupation. Dites la hauteur et la largeur doit être aménagé en 3 octets chacun, avec une pièce d'identité et de la longueur pour le « format fil », vous faites quelque chose comme

public byte[] marshalScreenResolution(ScreenResolution obj) { 
    byte[] buf = new byte[9]; 
//length of this packet, 2 bytes 
    buf[0] = 0; 
    buf[1] = 9; 
    buf[2] = SCREENRESOLUTION_OPCODE; 
    //marshal the height/width , 3 least significant bytes. 
    buf[3] = (obj.height&0xff0000) >> 16; 
    buf[4] = (obj.height&0x00ff00) >> 8; 
    buf[5] = (obj.height&0x0000ff) ; 
    buf[6] = (obj.width&0xff0000) >> 16; 
    buf[7] = (obj.width&0x00ff00) >> 8; 
    buf[8] = (obj.width&0x0000ff) ; 

    return buf; 
} 

et vous faire une fonction demarshalScreenResolution pour aller d'un paquet à un objet ScreenResolution. Le point est que vous découplez la représentation en java de la représentation externe, et que vous assemblez les champs dans la représentation externe en utilisant des octets + quelques bits de base.

Questions connexes