鱼C论坛

 找回密码
 立即注册
查看: 3591|回复: 0

[技术原创] 154-数据流版本(version) + 幻数(magic number)-【扫盲】

[复制链接]
发表于 2016-11-7 10:38:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2016-11-7 10:45 编辑

0.png


从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;

说了那么多,其实这哥俩儿就是:

根据幻数和版本号来判断文件格式是否正确!


本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 22:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表