C++ Qt:按位运算
Posted
技术标签:
【中文标题】C++ Qt:按位运算【英文标题】:C++ Qt: bitwise operations 【发布时间】:2009-06-02 06:56:50 【问题描述】:我正在为大学做一个小项目,我需要对网络传输进行建模,并实现和可视化不同类型的纠错算法。我的即兴数据包由一个quint8组成:我需要将它转换为一个位数组,如QBitArray,附加一个校验位,通过UDP传输,用校验位检查传输是否成功,然后从中构造quint8 . 再说一次,这不是一个实用的任务,而是一个教育任务,所以不要建议我使用像 CRC 这样的真正算法......
所以我的问题是:如何将任何数据类型(在本例中为 quint8)转换为 QBitArray? 我的意思是计算机中的任何数据都是位数组,但我如何访问它是问题。
谢谢,德米特里。
【问题讨论】:
【参考方案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 数组并存储其位可能不安全。
【讨论】:
以上是关于C++ Qt:按位运算的主要内容,如果未能解决你的问题,请参考以下文章