马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2016-11-7 10:45 编辑
从Qt 1.0开始便有了相应的QDataStream的二进制格式~
当输入或输出复杂数据类型时,确保使用相同的数据流版本来进行读取或写入是非常重要的!
对于基于的C++数据类型,当然就没有这个要求啦。
主要就是为了实现:
既可以向前兼容,又可以向后兼容
常用的就是在程序中对数据流的版本号进行硬编码:
- stream.setVersion(QDataStream::Qt_5_0);
复制代码
如果要使用一个新的二进制数据格式,在自己的程序中创建的一个文档的文件格式,则:
需要在数据流的前面写入一个简短的数据头!
包含:
幻数(magic number)-常用来标志文件格式的常数 + 版本号 ,如下所示;
- QFile file("file.xxx");
- file.open(QIODevice::WriteOnly);
- QDataStream out(&file);
- //写入幻数和版本号
- //幻数可以使自定义的32位数字
- out << (quint32)0xA0B0C0D0;
- out << (qint32)456;
- out.setVersion(QDataStream::Qt_5_0);
- //写入数据
- out << lots_of_interesting_data;
复制代码
当然了幻数也可以是一个自定义数字,但必须是32位的~
- //读取数据流
- QFile file("file.xxx");
- file.open(QIODevice::ReadOnly);
- QDataStream in(&file);
- //读取幻数
- quint32 magic_number;
- in>>magic_number;
- if(magic_number != 0xA0B0C0D0)
- {
- return XXX_BAD_FILE_FORMAT;
- }
- //读取版本
- quint32 version;
- in>>version;
- if(version < 100)
- return XXX_BAD_FILE_TOO_OLD;
- if(version > 123)
- return XXX_BAD_FILE_TOO_NEW;
- if(version <= 110)
- in.setVersion(QDataStream::Qt_3_1);
- else
- {
- in.setVersion(QDataStream::Qt_4_0);
- }
- //读取数据
- in>>lots_of_interesting_data;
- if(version >= 120)
- in >> data_new_in_XXX_version_1_2;
- in>>other_interesting_data;
复制代码
说了那么多,其实这哥俩儿就是:
根据幻数和版本号来判断文件格式是否正确!
|