【问题标题】:C++ Qt: bitwise operationsC++ Qt:按位运算
【发布时间】:2009-06-02 06:56:50
【问题描述】:

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

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

谢谢,德米特里。

【问题讨论】:

    标签: c++ qt bit-manipulation


    【解决方案1】:

    让我们看看我们能不能把它弄对

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

    【讨论】:

    • 谢谢,这就是我想要的。第 6 行的错字:quint8 而不是 qint8。
    • 欢迎您,错字已修复
    【解决方案2】:

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

    【讨论】:

    • 程序将崩溃...您的代码中至少有 2 个错误。
    【解决方案3】:

    我认为声明模板函数然后将其参数转换为 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;
    }
    

    一般来说,无法将任何数据类型转换为位数组。特别是如果您的数据类型包含指针,您可能想要传输指针而不是指针。所以任何复杂的类型都应该分开处理。并注意不同架构中的不同字节序(小字节序和大字节序)。根据这个问题,我认为 std::bitset 是安全的,但是例如将指向 struct 的指针转换为 char 数组并存储其位可能不安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多