2012-01-08 9 views
5

जब हम इस पाठ "ali ata bak" के साथ एक टेक्स्ट फ़ाइल बनाते हैं, और हम इस फ़ाइल को प्रोग्राम के लिए इनपुट के रूप में उपयोग करते हैं। कोड सामान्य रूप से चल रहा है। लेकिन जब हम टेक्स्टफाइल में यह टेक्स्ट "1111111111111111111111" दर्ज करते हैं, तो कोड अपेक्षित नहीं चल रहा है। तो समस्या क्या है?QByteArray 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

से endianness के बारे में पढ़ने के लिए चाहते हो सकता है आप "अप्रत्याशित" से क्या मतलब है पैदा करता है? कृपया जो आप देख रहे हैं उसका वर्णन करें और आप क्या उम्मीद कर रहे थे। – 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

यह भी एक नोट: 'जबकि ((बाइट्स = infile.read (BUFFER_SIZE_BYTE))> 0) गलत है, q qyyteArray की तुलना int वास्तव में समझ में नहीं आता है। – Mat

+0

QByteArray के साथ स्पष्ट शून्य समाप्ति अनावश्यक है। –

+0

यह भी एक नोट: आउटपुट फ़ाइल का आकार इस समाधान के साथ 1 बाइट बढ़ता है – sivanzor

संबंधित मुद्दे