Qt的文档指出qint32
是signed int
的typedef,并且在Qt支持的所有平台上保证为32位。 [docs]
This表示signed int
不得小于short
,且大小必须至少为16位。因此,不能单独确定typedef的大小。 Qt绕过那个it seems。
因此对于使用Qt的(de)序列化,这很好,因为大小总是如此。然而,这并没有说明我所假设的那些数字的二进制表示。当(de)可移植地序列化时,这很重要。例如,这样做:
QFile file("somefile");
file.open(QIODevice::WriteOnly);
qint32 i = 10;
file.write(reinterpret_cast<const char*>(&i), sizeof(i));
file.flush();
file.close();
会将值为10的qint32
写入二进制形式的文件中。当我通过网络将该文件发送到另一个用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中移植(de)序列化原始类型?或者尺寸是否足够保证?
答案 0 :(得分:8)
您可以使用QDataStream进行(反)序列化。它从QIODevice继承的任何东西写入/读取,并为qint32提供显式的输入和输出运算符。
答案 1 :(得分:1)
我非常确定,对于Qt支持的所有平台,以下内容为assert(CHAR_BIT == 8)
。
考虑到这个假设,唯一要担心的是字节字节序。不幸的是,你的演员没有考虑到字节序。它以原生字节顺序写入整数,并假设数据是原生的读取。
事实上的标准解决方案是始终转换为网络字节序,这是大端。您会发现Qt提供了完全相同的功能:http://doc.qt.io/qt-4.8/qtendian.html
编辑:虽然,您可能想查看G.M.的答案,而不是自己实现序列化。
答案 2 :(得分:0)
您不限于二进制表示。将它们序列化为字符串(例如,Qt具有JSON支持)