2012-01-08 75 views
5

当我们用这个文本“ali ata bak”创建一个文本文件时,我们使用这个文件作为程序的输入。代码正常运行。但是当我们在文本文件中输入“1111111111111111111111”这个文本时,代码没有运行。那么问题是什么?QBitArray到QByteArray

#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(); 
} 
+0

字节序你所说的“意外”的意思是什么?请描述你所看到的以及你的期望。 – Mat 2012-01-08 08:24:37

+0

输出文件必须与输入相同,但文本“11111”不相同 – sivanzor 2012-01-08 08:27:23

回答

5

初始化问题。

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

这将产生正确的答案

+0

另请注意:while((bytes = infile.read(BUFFER_SIZE_BYTE))> 0)'不正确,将q QByteArray与int没有任何意义。 – Mat 2012-01-08 08:49:14

+0

QByteArray不需要显式空终止。 – 2012-01-08 09:51:12

+0

另外一个注释:输出文件的大小增长1字节与此解决方案 – sivanzor 2012-01-08 10:09:27