2009-06-02 1329 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数组并存储它的位可能不安全。