Russian Qt Forum
Апрель 30, 2024, 22:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Qt 4.4.3 msvc2008 QDataStream лишние 2-4 байта  (Прочитано 10110 раз)
foxexe
Гость
« Ответ #15 : Январь 18, 2010, 15:43 »


Вот мне интересно откуда взялся size если данные пишутся позже?

вот так вот
Код
C++ (Qt)
QByteArray block;
QDataStream(&block);
quint16 size;
out<<size;//можно заменить канеш на (quint16)0;
out<<str;
out<<str;
out<<str;
out.device()->seek(0);
size=block.size()-sizeof(quint16)
out<<size;//или  сразу (quint16)((block.size()-sizeof(quint16))
 

впринципе таким обрахом вместо QString можно зафигурить любой друго тип данных главное его правильно прочитаться я так понимаю)
« Последнее редактирование: Январь 18, 2010, 15:46 от foxexe » Записан
BRE
Гость
« Ответ #16 : Январь 18, 2010, 15:51 »

Вот мне интересно откуда взялся size если данные пишутся позже?
Для этого нужно посмотреть выше озвученный пример.  Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Январь 18, 2010, 15:59 »

Код
C++ (Qt)
QByteArray block;
QDataStream(&block);
quint16 size;
out<<size;//можно заменить канеш на (quint16)0;
out<<str;
out<<str;
out<<str;
out.device()->seek(0);
size=block.size()-sizeof(quint16)
out<<size;//или  сразу (quint16)((block.size()-sizeof(quint16))
 
Вот это действительно расписано, все ясно. Два технических момента:

1) quint32 (вместо quint16) выглядит солиднее  Улыбающийся
2) не обязательно связываться с block.size(), часто лучше использовать position() (сохраненное перед out << size)

Но эти детали не очень существенны.
Записан
foxexe
Гость
« Ответ #18 : Январь 18, 2010, 16:16 »

1) quint32 (вместо quint16) выглядит солиднее  Улыбающийся
ахахахх)) да) но я что-то тут же на форуме читал с проблемой пересылки более 40 кб, так что 32бита наверное слишком.

2) не обязательно связываться с block.size(), часто лучше использовать position() (сохраненное перед out << size)
те есть сохранить позицию до seek(0)? а почему имеено так, ведь непонятно куда указывает позишн, мошт там единичку надо вычесть, всё-таки block.size() более ориентировано на решение подобной проблемы, или вы знаете что-то что не знаю я)))

Для этого нужно посмотреть выше озвученный пример.  Подмигивающий

Это было просто ле - ...  гендарно

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Январь 18, 2010, 21:39 »

ахахахх)) да) но я что-то тут же на форуме читал с проблемой пересылки более 40 кб, так что 32бита наверное слишком.
Ну если следовать этой логике то пакеты/файлы больше 40К передаваться не должны  Улыбающийся Да хотя бы в Вашем же примере: разве QString не может быть больше 64K?

те есть сохранить позицию до seek(0)? а почему имеено так, ведь непонятно куда указывает позишн, мошт там единичку надо вычесть, всё-таки block.size() более ориентировано на решение подобной проблемы, или вы знаете что-то что не знаю я)))
Я не знаю ничего "особенного". Ну хотя бы тот же Photoshop - как он пишет свой psd файл? Да точно так же как и десятки др. хороших программ: просто IFF свободная спецификация. Общий формат

- ID тега
- число байт в теге
- сами байты/данные

Подробности уже писал здесь http://www.prog.org.ru/topic_10681_0.html
Помимо прочего это дает возможность "старой" версии программы читать "новые" файлы т.к. их можно просто обойти (пропустить неизвестный тег и читать дальше).

Ну правда в талмуде (Assistant) этого нет  Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 23.