décaler des bits

TomDev83TomDev83 Membre
juin 2010 modifié dans API AppKit #1
Bonjour à  tous et à  toutes,

Voilà  depuis quelques semaine que je travail sur le portage d'un application windobe codée en VB.NET sous mac mais je rencontre un problème dans une classe qui parse les packets reçu par l'utilisation de socket, je ne sais vraiment pas comment décaler des bits dans un NSMutableData ou autres.

Le packet est à  la base un NSMutableData, il faut juste que je puisse obtenir le MessageId qui est un short.

Bref voici le code problématique en VB.NET :
class Packet<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; public Packet(string packet)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.PacketString = packet;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; public string PacketString<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; public byte&#91;] PacketBytes<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Encoding.Default.GetBytes(this.PacketString);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; public short MessageId<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (short)((( PacketBytes[0] &lt;&lt; 8 ) + PacketBytes[1] ) &gt;&gt; 2);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }


J'ai trouvé cela :
L'opérateur << décale à  gauche les bits du premier opérande du nombre de positions spécifié. Les bits de poids fort situés en dehors de la plage du type de résultat sont éliminés, et les positions libérées par les bits de poids faible sont remplies par des zéros.
L'opérateur >> décale à  droite les bits du premier opérande du nombre de positions spécifié. Les bits de poids faible sont éliminés et, si l'opérande de gauche est positif, les positions libérées par les bits de poids fort sont mises à  zéro ; s'il est négatif, elles sont mises à  un. Si l'opérande de gauche est de type Byte, les bits de poids fort disponibles sont remplis par des zéros.


Mais je ne sais pas comment décaler des bits dans un NSMutableData.

J'espère que certains d'entre vous connaissent bien le VB pour pouvoir me traduire cette classe, sinon mon projet tombe à  l'eau et j'aurais traduit les 3/4 des classes pour rien...

Merci d'avance pour votre aide !
Et j'espère pouvoir à  mon tour aider la communauté !

Réponses

  • zoczoc Membre
    18:08 modifié #2
    dans 1277848445:

    Mais je ne sais pas comment décaler des bits dans un NSMutableData.

    C'est quand même pas bien compliqué parce que c'est exactement la même chose qu'en VB, et que pour récupérer un tableau "C" à  partir d'un NS(Mutable)Data il suffit de lire la doc...  ::)

    const unsigned char *data = (const unsigned char *)[packetData bytes];&nbsp; // packetData est un NSData*<br />return (short)((( data[0] &lt;&lt; 8 ) + data[1] ) &gt;&gt; 2);
    
  • ChachaChacha Membre
    18:08 modifié #3
    Un précision : au lieu de faire les décalages toi-même, utilise plutôt les fonctions du genre CFSwapInt16BigToHost(), qui s'adapteront à  l'architecture du système hôte.
  • zoczoc Membre
    juin 2010 modifié #4
    Hummm ">>" et "<<" décalent respectivement à  droite et à  gauche quelle que soit l'architecture du système hôte... Et tant qu'on travaille sur des chars (qui sont l'équivalent du byte .NET), il n'y a de toute façon pas de problème d'endianisme. Donc pourquoi faire appel à  une fonction pour faire un simple décalage dans un octet ??


    Par contre, je viens de relire le code et un truc me chagrine: "PacketBytes[0] << 8" vaut toujours 0 si PacketBytes est un tableau de byte...


    Edit: En fait, maintenant que je comprends ce que fait le code (je n'avais pas vraiment réfléchi au but, juste au moyen de traduire d'un langage à  l'autre), Chacha a raison: Utiliser CFSwapInt16BigToHost() qui va remplacer le décalage de 8 à  gauche et l'addition, et se contenter de faire le décalage à  droite de 2 pour terminer est la bonne solution.


    Ca devrait donc donner un truc du genre:


    const uint16_t *data = (const uint16_t *)[packetData bytes];&nbsp; // packetData est un NSData*<br />return CFSwapInt16BigToHost(data[0]) &gt;&gt; 2;
    


  • TomDev83TomDev83 Membre
    18:08 modifié #5
    Merci beaucoup de votre aide, rapide et efficace 
  • psychoh13psychoh13 Mothership Developer Membre
    18:08 modifié #6
    Au passage, c'est pas du VB.NET que tu fais mais du C#...


    Aussi, si l'objet est un NSData, tu n'as pas le droit de modifier les données retournées par -bytes. Il faut que l'objet soit un NSMutableData et que tu modifies le buffer retourné par -mutableBytes.
Connectez-vous ou Inscrivez-vous pour répondre.