Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt - QByteArray - Parse raw data

Parse séquentiellement des raw data

Sujet résolu
    8 avril 2022 à 22:39:10

    Bonjour !
    je m'intéresse aux raw data (suivie de données). (Je met un exemple ci dessous).
    Jusque là je faisais grâce à la fonction mid :
    rawedTx.mid(0,4).toHex().toUShort(nullptr,16)
    ...
    ce qui me permet de lire séquentiellement le flux de donnée. Cependant, n'existe t-il pas un autre moyen plus rapide de parse des flux de données continus ? tels que :
    ```
    0b11090776657273696f6e00000000002f0000008259d70da009010000000000287b486200000000192f5361746f7368693a302e362e38284578706c6f726572292f0000000001
    ```
    Où par exemple :
    - les 4 premiers bits (0b110907) représente le network flag...
    - les 12 autres : la commande
    etc...

    Auriez-vous une idée ?
    Bien cordialement.
    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2022 à 22:48:31

      Chacune de ces fonctions (mid, toHex, toUShort) créent des nouveaux objets, donc très coûteux. Il faut que tu évites les créations d'objets intermédiaires, avec des string view, des [], des iterateurs, etc.
      • Partager sur Facebook
      • Partager sur Twitter
        9 avril 2022 à 1:49:25

        Typiquement, c'est ce que peut faire QDataStream et son opérateur >> au moins pour les types simples (entiers, flottants) et comme QDataStream crée un QBuffer interne pour gérer la position du curseur de lecture dans le QByteArray, tu peux également y lire ta commande de 12 octets ce qui fera également avancer ce curseur pour les lectures suivantes :

        const char* chaine = "0b11090776657273696f6e00000000002f0000008259d70da009010000000000287b486200000000192f5361746f7368693a302e362e38284578706c6f726572292f0000000001";
        QByteArray data = QByteArray::fromHex(chaine);
        QDataStream out(data);
        // Sélectionne l'ordre des octets pour les entiers
        out.setByteOrder(QDataStream::BigEndian);
        // Lit un entier non signé sur 4 octets 
        quint32 flag;
        out >> flag;
        // Utilise le QBuffer interne créé par QDataStream pour lire les 12 octets suivants dans un QByteArray
        QByteArray commande = out.device()->read(12);
        
        • Partager sur Facebook
        • Partager sur Twitter
          9 avril 2022 à 3:02:18

          Salut,

          Au passage:

          Loopite a écrit:

          - les 4 premiers bits (0b110907) représente le network flag...

          Non, ca, ce ne sont pas les quatre premiers bits, mais bien les quatre premier bytes représentés en hexadécimale, les quatre premiers octets, si vous préférez et bien que je haïsse ce terme ;).  Cela correspond à 32 bits, ce qui fait directement beaucoup plus ;)

          -
          Edité par koala01 9 avril 2022 à 3:05:27

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            9 avril 2022 à 8:11:08

            Bonjour. Merci à tous de vos réponses ! Merci de m’avoir repris sur les bytes également. Je vais fermer le sujet.
            • Partager sur Facebook
            • Partager sur Twitter

            Qt - QByteArray - Parse raw data

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown