2009-06-02 84 views
3

我正在爲大學開展一個小項目,我需要通過網絡對傳輸進行建模,並將不同類型的錯誤校正算法進行打印和可視化。我的即興數據包由一個quint8組成:我需要將它轉換爲位數組,如QBitArray,將一個校驗位添加到它,通過UDP進行傳輸,使用校驗位檢查傳輸是否成功,然後構建quint8 。 再次,它不是一個實際的,但教育任務,因此不建議我用像CRC真正的算法爲...C++ Qt:按位運算

所以我的問題是:我怎麼轉換成任何類型的數據(在這種情況下quint8)到QBitArray?我的意思是計算機中的任何數據都是有點數組的,但我如何訪問它是個問題。

謝謝,德米特里。

回答

5

讓我們看看,如果我們可以得到它正確

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

謝謝,這是我想要的。 第6行的錯字:quint8而不是qint8。 – Dmitri 2009-06-02 10:56:15

1

qint8實際上是有符號的字符。所以你可以把你的objs當作一個char數組。

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

該程序將崩潰...您的代碼中至少有2個錯誤。 – TimW 2009-06-02 08:06:01

0

我沒有看到聲明模板函數,然後撒開參數UINT8任何一點。 解決方案的類型,可以晉升爲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; 
} 

沒有辦法一般將任何數據類型位陣列。特別是如果你的數據類型包含指針,你可能想要傳遞指針而不是指針。所以任何複雜類型都應該分開處理。並且要注意不同體系結構中的不同endiannes(小端和大端)。我認爲std :: bitset根據這個問題是安全的,但是例如將一個指向struct的指針指向char數組並存儲它的位可能不安全。