繁体   English   中英

C ++ Qt:按位运算

[英]C++ Qt: bitwise operations

我正在为大学开展一个小项目,我需要通过网络模拟传输,并对不同类型的纠错算法进行推理和可视化。 我改进的数据包由一个quint8组成:我需要将它转换为一个位数组,如QBitArray,向它附加一个校验位,通过UDP传输它,用校验位检查传输是否成功,然后从中构造quint8 。 再一次,这不是一个实际但教育性的任务,所以不要建议我使用像CRC这样的真实算法......

所以我的问题是: 如何将任何数据类型(在本例中为quint8)转换为QBitArray? 我的意思是计算机中的任何数据都是一个位数组,但我如何访问它是个问题。

谢谢,德米特里。

让我们看看我们是否能够正确理解它

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 ) ;
}

qint8实际上是签名char。 因此,您可以将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 ) ;
}

我没有看到声明模板函数然后将其参数转换为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(little-endian和big-endian)。 我认为std :: bitset根据这个问题是安全的,但是例如将一个指向struct的指针转换为char数组并存储它的位可能不安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM