2009-06-02 5 views
3

Je travaille sur un petit projet pour le collège, et j'ai besoin de modéliser la transmission sur le réseau, et de mettre en œuvre et de visualiser différentes sortes d'algorithmes de correction d'erreurs. Mon paquet improvisé se compose d'une quint8: je dois le convertir en un tableau de bits, comme QBitArray, y ajouter un bit de contrôle, le trasfer sur UDP, vérifier le succès de la transmission avec le bit de contrôle, puis construire quint8 . Encore une fois, ce n'est pas une tâche pratique mais aussi éducative, il ne faut pas me suggérer d'utiliser comme de véritables algoriths CRC ...C++ Qt: opérations bit à bit

Ma question est la suivante: comment puis-je convertir tout type de données (dans ce cas quint8) dans QBitArray? Je veux dire toutes les données dans l'ordinateur est un tableau de bits, mais comment y accéder est la question.

Merci, Dmitri.

Répondre

5

permet de voir si nous pouvons l'obtenir correcte

template < class T > 
static QBitArray toQBit (const T &obj) { 
    int const bitsInByte= 8; 
    int const bytsInObject= sizeof(T); 

    const quint8 *data = static_cast<const quint8*>(&obj) ; 
    QBitArray result(bytsInObject*bitsInByte); 
    for (int byte=0; byte<bytsInObject ; ++byte) { 
     for (int bit=0; bit<bitsInByte; ++bit) { 
      result.setBit (byte*bitsInByte + bit, data[byte] & (1<<bit)) ; 
     } 
    } 
    return result; 
} 

void Foo() { 
    Bar b ; 
    QBitArray qb = toQBit (b) ; 
} 
+0

Merci, c'est ce que je voulais. Typo à la ligne 6: quint8 au lieu de qint8. – Dmitri

+0

vous êtes welcom, la faute de frappe est fixée – TimW

1

qint8 est en réalité signé car. Vous pouvez donc traiter vos objs comme un tableau de caractères.

template < class T > 
QBitArray toQBit (T &obj) { 
    int len = sizeof(obj) * 8 ; 
    qint8 *data = (qint8*)(&obj) ; 
    QBitArray result ; 
    for (int i=0; i< sizeof(data); ++i) { 
     for (int j=0; j<8; ++j) { 
      result.setBit (i*8 + j, data[i] & (1<<j)) ; 
     } 
    } 
    return result; 
} 

void Foo() { 
    Bar b ; 
    QBitArray qb = toQBit (b) ; 
} 
+0

Le programme va planter ... il y a au moins 2 bugs dans votre code. – TimW

0

Je ne vois pas de point de déclarer la fonction de modèle, puis jetant son argument à Uint8. Solution pour les types qui peuvent être promu unsigned long

#include <bitset> 
template <typename T> 
QBitArray toQBit(T val) { 
    std::bitset<sizeof(T) * 8> bs(val); 
    QBitArray result(bs.size()); 
    for (int ii = 0; ii < bs.size(); ++ii) { 
     result.setBit(ii, bs.test(ii)); 
    } 
    return result; 
} 

Il n'y a aucun moyen de convertir génériquement tout type de données à un tableau de bits. Surtout si votre type de données contient des pointeurs, vous voulez probablement transférer la pointe et non le pointeur. Tout type complexe doit donc être traité séparément. Et faites attention aux différentes endiannes (little-endian et big-endian) dans différentes architectures. Je pense que std :: bitset est sûr selon ce problème, mais par exemple lancer un pointeur sur struct vers un tableau char et stocker ses bits peut ne pas être sûr.