鱼C论坛

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

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

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

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

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

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

0.png


从Qt 1.0开始便有了相应的QDataStream的二进制格式~

当输入或输出复杂数据类型时,确保使用相同的数据流版本来进行读取或写入是非常重要的!

对于基于的C++数据类型,当然就没有这个要求啦。

主要就是为了实现:

既可以向前兼容,又可以向后兼容


常用的就是在程序中对数据流的版本号进行编码:

  1. stream.setVersion(QDataStream::Qt_5_0);
复制代码


如果要使用一个新的二进制数据格式,在自己的程序中创建的一个文档的文件格式,则:

需要在数据流的前面写入一个简短的数据头!


包含:

幻数(magic number)-常用来标志文件格式的常数 + 版本号
,如下所示;

  1.     QFile file("file.xxx");
  2.     file.open(QIODevice::WriteOnly);
  3.     QDataStream out(&file);
  4.     //写入幻数和版本号
  5.     //幻数可以使自定义的32位数字
  6.     out << (quint32)0xA0B0C0D0;
  7.     out << (qint32)456;

  8.     out.setVersion(QDataStream::Qt_5_0);
  9.     //写入数据
  10.     out << lots_of_interesting_data;
复制代码


当然了幻数也可以是一个自定义数字,但必须是32位的~

  1. //读取数据流
  2.     QFile file("file.xxx");
  3.     file.open(QIODevice::ReadOnly);
  4.     QDataStream in(&file);
  5.     //读取幻数
  6.     quint32 magic_number;

  7.     in>>magic_number;
  8.     if(magic_number != 0xA0B0C0D0)
  9.     {
  10.            return XXX_BAD_FILE_FORMAT;
  11.     }
  12.     //读取版本
  13.     quint32 version;

  14.     in>>version;
  15.     if(version < 100)
  16.         return XXX_BAD_FILE_TOO_OLD;

  17.     if(version > 123)
  18.         return XXX_BAD_FILE_TOO_NEW;

  19.     if(version <= 110)
  20.         in.setVersion(QDataStream::Qt_3_1);

  21.     else
  22.     {
  23.         in.setVersion(QDataStream::Qt_4_0);
  24.     }
  25.     //读取数据
  26.     in>>lots_of_interesting_data;
  27.     if(version >= 120)
  28.         in >> data_new_in_XXX_version_1_2;
  29.     in>>other_interesting_data;
复制代码


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

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


本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 22:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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