2016-06-22 2 views
1

Документация Qt утверждает, что qint32 является typedef для signed int и гарантированно будет 32-разрядным на всех платформах, поддерживаемых Qt. [docs]Как переносить серию qint32?

This утверждает, что signed int не должно быть меньше, чем short и должен быть по крайней мере 16 бит в размере. Таким образом, нет гарантии размера только в typedef. Qt обошел вокруг этого it seems.

Так что для (де) сериализации с Qt это хорошо, потому что размер всегда будет таким. Однако это ничего не говорит о двоичном представлении тех чисел, которые я предполагаю. И это имеет значение, когда (де) сериализуется портативно. Например, делать это:

QFile file("somefile"); 
file.open(QIODevice::WriteOnly); 
qint32 i = 10; 
file.write(reinterpret_cast<const char*>(&i), sizeof(i)); 
file.flush(); 
file.close(); 

запишет qint32 значения 10 в файл в двоичном виде. Когда я отправить этот файл по сети в другое приложение написано в Qt делает это:

QFile file("somefile"); 
file.open(QIODevice::ReadOnly); 
qint32 i = 0; 
file.read(reinterpret_cast<char*>(&i), sizeof(i)); 
file.close(); 

Я действительно получить ряд обратно, но это гарантированно всегда будет 10? Я не думаю, что двоичное представление 10 на этой машине может отличаться. Но возможно, я понимаю это неправильно, и это не проблема (для Qt поддерживаемых платформ, по крайней мере).

Следовательно, мой вопрос: как переносить (де) сериализацию примитивных типов в Qt? Или размер гарантии достаточно?

+2

Обратите внимание, что Qt даже не компилируется, если только 'CHAR_BIT == 8' и' sizeof (int) == 4'. Это явно протестировано: https://code.woboq.org/qt5/qtbase/src/corelib/global/qglobal.cpp.html#106 – peppe

ответ

8

Вы можете использовать QDataStream для (де) сериализации. Он пишет/читает все, что наследует от QIODevice, и имеет явные операторы ввода и вывода для qint32.

+0

Спасибо, документы четные: «Поток данных - это двоичный поток закодированную информацию, которая на 100% не зависит от операционной системы хоста, процессора или байта. Например, поток данных, написанный ПК под Windows, может быть прочитан Sun SPARC, работающим под управлением Solaris ». которые я почему-то пропустил. – Resurrection

1

Я уверен, что для всех платформ, поддерживаемых Qt, существует assert(CHAR_BIT == 8).

Учитывая это предположение, единственное, о чем нужно беспокоиться, это байт-сущность. К сожалению, ваш актерский состав не учитывает утверждение. Он записывает целое число в native endianness и читает, считая, что данные являются родными.

Де-факто стандартное решение состоит в том, чтобы всегда преобразовывать в/из сетевой континент, который является большим аргументом. Вы обнаружите, что Qt предоставляет функции для выполнения именно этого: http://doc.qt.io/qt-4.8/qtendian.html

Редактирование: хотя вы можете захотеть проверить ответ G.M., а не реализовывать сериализацию самостоятельно.

0

Вы не ограничены двоичным представлением. Сериализуйте их в строку (например, Qt поддерживает JSON)

Смежные вопросы