马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
说了那么多,其实这哥俩儿就是:
根据幻数和版本号来判断文件格式是否正确!
|