Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Откуда беруться 4 байта в начале файла 
V
    Опции темы
newbie2009
Дата 7.1.2012, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Значит хочу например считать ноутпад.ехе, закинуть его в массив байтов , а затем этот массив сохранить в файл с названием 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

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


PM MAIL   Вверх
cutwater
Дата 7.1.2012, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



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


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

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

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

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

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

Это сообщение отредактировал(а) cutwater - 7.1.2012, 00:55


--------------------
user posted image
PM MAIL   Вверх
newbie2009
Дата 7.1.2012, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



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

Если не сложно, то подскажите мне ответ на след. вопрос. Я хочу далее 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 байта и все, пришлось делать по байтовую копию...

Можно как-то скопировать без побайтовой копии или только так?
PM MAIL   Вверх
Sality123
Дата 7.1.2012, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.3.2011

Репутация: нет
Всего: нет



Код

 QByteArray ba = file.readAll();

QString test = QString(ba) ;

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

PM MAIL   Вверх
newbie2009
Дата 7.1.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



так оно не работает... только 3 первых байта закидует и все

PM MAIL   Вверх
bsa
Дата 8.1.2012, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



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

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

PM   Вверх
newbie2009
Дата 9.1.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Спасибо. А не подскажете почему оно не хотело работать без перекодировки в бейс64?
PM MAIL   Вверх
cutwater
Дата 10.1.2012, 00:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 2
Всего: 10



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


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

Это сообщение отредактировал(а) cutwater - 10.1.2012, 00:14


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0666 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.