2012-01-08 3 views
5

Когда мы создаем текстовый файл с этим текстом «ali ata bak», и мы используем этот файл в качестве входных данных для программы. Код работает нормально. Но когда мы вводим «111111111111111111111111» этот текст в текстовом файле, код не работает. Так в чем проблема?QBitArray to 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

+0

Выходной файл должен быть одинаковым с вводом, но файл с текстом «11111» не тот же – sivanzor

ответ

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

+0

Явное завершение нулевой точки не требуется в QByteArray. –

+0

Также примечание: размер выходного файла растет 1 байт с этим решением – sivanzor

Смежные вопросы