【问题标题】:QBitArray to QByteArrayQBitArray 到 QByteArray
【发布时间】:2012-02-05 06:28:59
【问题描述】:

当我们使用此文本“ali ata bak”创建一个文本文件时,我们将此文件用作程序的输入。代码运行正常。但是当我们在文本文件中输入“1111111111111111111111”这个文本时,代码没有运行预期。那么问题出在哪里?

#include <QtCore/QCoreApplication>
#include <QBitArray>
#include <QByteRef>
#include <QFile>
#include <iostream>
#include <stdlib.h>
#include <QTextStream>

// Buffer Size #num of KB's
#define BUFFER_SIZE_KB 1

// Do not change !!
#define BUFFER_SIZE_BYTE BUFFER_SIZE_KB*1024
#define BUFFER_SIZE_BIT  BUFFER_SIZE_BYTE*8

using namespace std;


QBitArray bytesToBits(QByteArray bytes) {
    QBitArray bits(bytes.count()*8);
    // Convert from QByteArray to QBitArray
    for(int i=0; i<bytes.count(); ++i)
        for(int b=0; b<8; ++b)
            bits.setBit(i*8+b, bytes.at(i)&(1<<b));
    return bits;
}


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


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString inFilename;
    QString outFilename;
    QTextStream qtin(stdin);


    cout << "Filename : ";
    qtin >> inFilename;
    outFilename.append("_");
    outFilename.append(inFilename);

    QFile infile(inFilename);
    if (!infile.open(QIODevice::ReadOnly)) {
        cout << "\nFile cant opened\n";
        system("pause");
        return 1;
    }

    QFile outfile(outFilename);
    if (!outfile.open(QIODevice::WriteOnly)) {
        cout << "\nFile cant opened\n";
        system("pause");
        return 2;
    }

    QByteArray bytes, bytes2;
    QBitArray bits;


    while ((bytes = infile.read(BUFFER_SIZE_BYTE)) >0 ) {

        bits = bytesToBits(bytes);
        bytes2 = bitsToBytes(bits);// PROBLEM IS HERE
        outfile.write(bytes2);

    }

    outfile.close();
    infile.close();
    cout << "Finished\n";
    return a.exec();
}

【问题讨论】:

  • “意外”是什么意思?请描述您所看到的以及您所期望的。
  • 输出文件必须与输入文件相同,但包含文本“11111”的文件不一样

标签: c++ qt qbytearray


【解决方案1】:

初始化问题。

QByteArray bitsToBytes(QBitArray bits) {
    QByteArray bytes;
    bytes.resize(bits.count()/8+1);
    bytes.fill(0);
    // 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;
}

这会产生正确的答案

【讨论】:

  • 另请注意:while ((bytes = infile.read(BUFFER_SIZE_BYTE)) &gt;0 ) 不正确,将 q QByteArray 与 int 进行比较没有任何意义。
  • QByteArray 不需要显式的 null 终止。
  • 另请注意:使用此解决方案输出文件大小增加 1 个字节
  • 我注意到 QbitArray 实际上是由 QByteArray 支持的。或许能够利用这一点得出更好的解决方案。
  • 请在没有+1的情况下调整大小
【解决方案2】:

您可能还想阅读 Wikipedia http://en.wikipedia.org/wiki/Endianness 中有关字节顺序的信息

【讨论】:

    【解决方案3】:
    QByteArray bitsToBytes(const QBitArray& bits)
    {
        QByteArray bytes;
        QDataStream stream(&bytes, QIODevice::WriteOnly);
        stream << bits;
        return bytes;
    }
    

    【讨论】:

    • 这好像在bytes前面加了"\x00\x00\x00\b"。
    【解决方案4】:
    QBitArray bits(8);
    
    // The deep copy of bits
    QByteArray bytes(bits.bits(), bits.count() / 8); 
    --------------------------------------------------------------------------
    // The bits are not copied
    QByteArray bytes = QByteArray::fromRawData(bits.bits(), bits.count() / 8); 
    

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 2016-11-04
      • 2012-02-03
      • 2012-12-17
      • 2016-02-24
      • 2013-12-05
      • 2020-04-25
      • 2015-01-28
      • 2018-12-22
      相关资源
      最近更新 更多