Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: developer-nsk от Сентябрь 03, 2010, 15:51



Название: Порядок следования байтов qint64
Отправлено: developer-nsk от Сентябрь 03, 2010, 15:51
Здравствуйте, господа программисты!
У меня возник следующий вопрос - вывожу в бинарный файл несколько переменных типа qint64 (или long long - без разницы). Затем другое приложение, реализованное на борланд билдере, должно этот бинарник читать. И тут самое интересное - при выводе переменной в бинарный поток Qt не меняет порядок следования байт, как это делают дельфи, билдер и другие языки программирования (то есть Qt пишет байты по порядку, как они идут в переменной). Причём, как я понял, Qt в этом смысле реализует не совсем стандартный подход, то есть замена порядка следования байтов . Поэтому вопрос - можно ли в Qt записывать переменные типа qint64 в бинарный файл через поток так, чтобы порядок следования байтов был изменён и борландовские приложения могли читать их без проблем? Заранее спасибо за помощь.

Код:
    QFile outp("file");
    if (!outp.open(QIODevice::WriteOnly)) printf("Error!");
    QDataStream out(&outp);
    qint64 a=100;
    out << a;
    outp.close();


Название: Re: Порядок следования байтов qint64
Отправлено: vipet от Сентябрь 03, 2010, 16:14
гхм.. попробуй void QDataStream::setByteOrder ( ByteOrder bo )


Название: Re: Порядок следования байтов qint64
Отправлено: developer-nsk от Сентябрь 03, 2010, 16:31
Спасибо огромное! Это похоже на то, что нужно! Буду пробовать!


Название: Re: Порядок следования байтов qint64
Отправлено: lit-uriy от Сентябрь 03, 2010, 19:57
>>Qt не меняет порядок ... как это делают дельфи, билдер и другие языки программирования
:D


Название: Re: Порядок следования байтов qint64
Отправлено: Igors от Сентябрь 04, 2010, 11:03
Ну с непривычки little/big endian "бъет по ушам", попробую объяснить популярно. Есть 2 семейства процессоров которые адресуют данные по-разному. Напр число 0x0123 будет записано в памяти так

0x0123  // big endian
0x2301  // little endian

Для тривиального типа любого размера один endian может быть всегда получен из другого перестановкой байт "наоборот". Считается хорошим тоном писать данные на диск в big endian, по умолчанию QDataStream тоже делает так. Как уже сказали это можно изменить, но нет никакой общей "совместимости" с др приложениями. Часто файл данных не содержит никаких указаний об endian, это указывается в документации - и все. Записав данные в одном endian, Вы получаете совместимость с 1 приложением но, возможно, теряете с другим


Название: Re: Порядок следования байтов qint64
Отправлено: Пантер от Сентябрь 04, 2010, 12:16
Советую почитать
http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2 (http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2)


Название: Re: Порядок следования байтов qint64
Отправлено: developer-nsk от Сентябрь 08, 2010, 18:51
Спасибо всем за полезную информацию!