Документация 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? Или размер гарантии достаточно?
Обратите внимание, что Qt даже не компилируется, если только 'CHAR_BIT == 8' и' sizeof (int) == 4'. Это явно протестировано: https://code.woboq.org/qt5/qtbase/src/corelib/global/qglobal.cpp.html#106 – peppe