【问题标题】:converting QBitArray to QByteArray将 QBitArray 转换为 QByteArray
【发布时间】:2012-02-03 04:13:21
【问题描述】:

此功能对于某些输入无法正常工作,那么错误是什么?

所有项目代码在这里:link

ps:我正在使用“bits.size()%8”等于零的输入

QByteArray bitsToBytes(QBitArray bits) {
  QByteArray bytes;
  bytes.resize(bits.count()/8);

  // Convert from QBitArray to QByteArray
  for(int b=0; b<bits.count(); ++b)
    bytes[b/8] = ( bytes.at(b/8) | ((bits[b]?1:0)<<(b%8)));

  return bytes;
}

【问题讨论】:

  • 首先,你想得到什么?你能给我们提供样本输入和输出吗?然后,您的代码似乎几乎是正确的。唯一的建议:在使用变量之前不要忘记初始化变量,例如:bytes.fill(0);

标签: c++ qt qbytearray


【解决方案1】:

Topro 算法整体上应该是正确的。但是我的演唱会是测试bits[b]?1:0

默认情况下,operator[] ( int i ) 返回“索引位置 i 处的位作为可修改的引用”,而 operator[] ( int i ) const 返回一个布尔值。如果第一个定义被选中,您将测试引用是否为真。

使用bits.testBit(b) 尝试 Topro 算法。

【讨论】:

    【解决方案2】:

    我认为这可能是位应该左移(7 - (b % 8))

    我试过了,得到了预期的结果。

    QBitArray bits;
    QByteArray bytes;
    
    bits.resize(12);
    bits.fill(true);
    
    bits.setBit(2,false);
    
    bytes.resize((bits.count() - 1) / 8 + 1);
    
    for(int b=0; b<bits.count(); ++b)
        bytes[b/8] = ( bytes.at(b/8) | ((bits[b]?1:0)<<(7-(b%8))));
    
    for (int b=0;b<bytes.size();b++)
        printf("%d\n",(quint8)bytes.at(b));
    

    【讨论】:

      【解决方案3】:

      考虑这种情况,其中 (bits.count() % 8) != 0 ,例如9 然后bytes.resize(bits.count()/8);返回错误的结果。

      正如 Topro 在评论中建议的那样,您可以使用 bytes.resize((bits.count() - 1) / 8 + 1))

      【讨论】:

      • @Topro:他正在做一个按位 OR ;设置位的顺序无关紧要
      • 是的,考虑是((bits.count() - 1) / 8 + 1)
      • 实际上我的问题在于所有数据。不仅是最后一个字节
      猜你喜欢
      • 2016-11-04
      • 2012-02-05
      • 2013-12-25
      • 2020-09-18
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多