不二如是 发表于 2016-11-7 10:38:23

154-数据流版本(version) + 幻数(magic number)-【扫盲】

本帖最后由 不二如是 于 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;


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

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

页: [1]
查看完整版本: 154-数据流版本(version) + 幻数(magic number)-【扫盲】