Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Откуда беруться 4 байта в начале файла


Автор: newbie2009 7.1.2012, 00:00
Значит хочу например считать ноутпад.ехе, закинуть его в массив байтов , а затем этот массив сохранить в файл с названием 2.ехе. Делаю это вот так:

Код

#include <QtCore/QCoreApplication>

#include <QFile>
#include <QDebug>


#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile file("e:/notepad.exe");

    if ( ! file.exists() ) {
        qDebug() << "file not exists";
        return -1;
    }

    if ( !file.open(QIODevice::ReadOnly) ) {
        qDebug() << "Cannot open file " ;
        return -2;
    }

    QByteArray ba = file.readAll();
    qDebug() << ba.size();
    qDebug() << ba.at(0);
    qDebug() << ba.at(1);
    qDebug() << ba.at(3);


    file.close();

     file.setFileName("e:/2.exe");
     if ( !file.open(QIODevice::WriteOnly) ) {
         return -10;
     }

     QDataStream tmp(&file);
     tmp.setVersion(QDataStream::Qt_4_7);
     tmp << ba;

     file.close();

    return a.exec();
}


Надо мне для того, что бы потом это все дело в виде пакета передавать куда-то....
Собственно, после копирования перед индитификатором PE файла, вырисовуется не понятно откуда 4 байта:
http://s1.ipicture.ru/uploads/20120107/qUIs0Rk2.jpg

Откуда беруться эти лишнии байты?


Автор: cutwater 7.1.2012, 00:50
Цитата(newbie2009 @  6.1.2012,  23:00 Найти цитируемый пост)
Собственно, после копирования перед индитификатором PE файла, вырисовуется не понятно откуда 4 байта:


Было бы понятно, если бы Вы ознакомились с документацией. Но на современном этапе развития общества документацию должны читать участники форума и докладывать об успехах вопрошающим.

Более подробно тут: http://developer.qt.nokia.com/doc/qt-4.8/datastreamformat.html

А проблема то банальна. Вы используете QDataStream, соответственно используя перегруженный оператор << в файл пишутся не только данные, а еще и информация о их размере (эти самые 4 байта), чтобы потом используя оператор >> их можно было восстановить. Соответственно, если Вам необходимо записать просто массив байт, QDataStream вообще не нужен. Воспользуйтесь методом write у file.

http://developer.qt.nokia.com/doc/qt-4.8/qiodevice.html#write-3

P.S. Данный ресурс http://tsya.ru/ будет так же полезен Вам для ознакомления.

Автор: newbie2009 7.1.2012, 12:58
Спасибо большое! Я смотрел доки, но бегло, в след. раз буду вчитываться....

Если не сложно, то подскажите мне ответ на след. вопрос. Я хочу далее QByteArray переписать в xml файлик, для этого получается мне надо по байтово перегнать мой QByteArray в QString:

Код

....
QByteArray ba = file.readAll();
QString test;

for(int i = 0; i < ba.size(); i++) {
        test.append(ba.at(i));
}
....
 QDomText text = doc.createTextNode(test);
....


Я пробывал вначале на прямую закидывать в xml файлик, так оно закидовало там 4 байта и все, пришлось делать по байтовую копию...

Можно как-то скопировать без побайтовой копии или только так?

Автор: Sality123 7.1.2012, 14:34
Код

 QByteArray ba = file.readAll();

QString test = QString(ba) ;

....
 QDomText text = doc.createTextNode(test);
....

Автор: newbie2009 7.1.2012, 16:41
так оно не работает... только 3 первых байта закидует и все

Автор: bsa 8.1.2012, 08:31
Цитата(newbie2009 @  7.1.2012,  13:58 Найти цитируемый пост)
Можно как-то скопировать без побайтовой копии или только так?

Код
QString text = QString::fromLatin1(ba.toBase64());
и обратно:
Код
QByteArray ba = QByteArray::fromBase64(text.toLatin1());

Автор: newbie2009 9.1.2012, 23:20
Спасибо. А не подскажете почему оно не хотело работать без перекодировки в бейс64?

Автор: cutwater 10.1.2012, 00:12
Цитата(newbie2009 @  9.1.2012,  22:20 Найти цитируемый пост)
Спасибо. А не подскажете почему оно не хотело работать без перекодировки в бейс64? 


Потому что вы вставляете содержимое "бинарног файла", содержащего символы, выходящие за пределы допустимых в XML документе. Соответственно их необходимо представить в виде допустимом для хранения в XML документе. Наиболее распространенным является вариант преобразования в base64.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)