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...
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.
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);
- 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
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
Bonjour. Merci à tous de vos réponses ! Merci de m’avoir repris sur les bytes également. Je vais fermer le sujet.
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.
Discord NaN. Mon site.