我们知道Qt中的QBitArray类支持在位(bit)的层次上进行数据操作。本文剖析该类在二进制文件读写时的一些要点。另外,在Qt中,QDataStream类对于二进制文件的读写提供了诸多便利,需要注意的是QBitArray的读写依赖于QDataStream类。

使用QBitArray向文件中写数据:

    QFile file("C:\\Users\\lenovo\\Desktop\\测试");
    file.open(QIODevice::WriteOnly);//只写
    QDataStream input(&file);
    QBitArray bit();//构造大小为5的位数组
    bit[]=;bit[]=;bit[]=;bit[]=;bit[]=;
    input<<bit;//向文件中写入数据10011
    file.close();

使用QBitArray向文件中读数据:

    QFile file("C:\\Users\\lenovo\\Desktop\\测试");
    file.open(QIODevice::ReadOnly);//只读
    QDataStream output(&file);
    QBitArray bit;//此处不需要指定位数组的大小,后面解释
    output>>bit;//从文件中读取数据,可以得到10011
    file.close();

  上面只是读写了一个简单的位数组,是最简单的例子。但是当我们需要连续多次的读写这种位数组时,甚至想要一位一位读取这些位信息时,该如何处理呢?

先明确一句话:在进行读操作时,无法根据指定的QBitArray位数组的大小(size)来读取。也就是说实际上读取到的size()大小,与自己设定的大小并不一致。(这个结论个人实验得出)

以如下代码为例:

    QFile file("C:\\Users\\lenovo\\Desktop\\测试");//该文件中已经存在位信息10011
    file.open(QIODevice::ReadOnly);//只读
    QDataStream output(&file);
    QBitArray bit();//此处我设置位数组的大小为3,我只想读取3位二进制信息
    output>>bit;//读取
    qDebug()<<bit.size();//输出结果为5,显然与我们希望的不一样。原因后面解释
    file.close();

  究竟是什么原因造成的呢??我们开始进入重点:分析这个原因我们需要分析QBitArray在文件中的编码规则。

  每一个完整的QBitArray对象,存储进文件后,其编码格式都是固定的:位数组的大小+位数组的实际数据。以位数据10001为例:其编码为

(图片中每个数字代表四个位,用16进制表示)

1、4个字节存储该位数组的位数,00 00 00 05就表示这个位数组有5位

2、剩下部分存储具体的位数据。可是我们的数据是1001 1为什么存储成了19呢???原因如下:

存储QBitArray对象时,采用的是逆存储方式,即先存储后四个位信息,再存储前四个位信息。19中的 “1” 表示 “0001”,“9”表示“10001”

注意这种情况:

    QFile file("C:\\Users\\lenovo\\Desktop\\测试");
    file.open(QIODevice::WriteOnly);//只写
    QDataStream input(&file);
    QBitArray bit();//构造大小为5的位数组
    bit[]=;bit[]=;bit[]=;bit[]=;bit[]=;
    input<<bit[];//写入数据

这种情况下,向文件中写入了一个位信息,这里并没有写入完整的对象。那么存储时,也就没有完整的结构。其编码如下图:

相当于向文件写入了一个数字1。如果bit[0]=0,那么相当于向文件中写入了一个数字0。

总结:也就是说,每个QBitArray对象存储进文件后的结构都是确定了的。所以如果想一个位一个位的读取,那么就会破坏掉这个对象的编码结构,以至于出现读取错误的情况。想要正确的读取出所有的位信息,必须完整的读取每个QBitArray对象,所以在读取的时候我们不需要设置位数组的大小。也就是说,写入的时候写了多少个QBitArray对象,读取的时候就得用多少个QBitArray对象。

最新文章

  1. BZOJ 1565: [NOI2009]植物大战僵尸
  2. 横版CG场景
  3. 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)
  4. 二、Ubuntu14.04下安装Hadoop2.4.0 (伪分布模式)
  5. Haproxy安装与配置
  6. 【风马一族_代码英语】代码英语之八 ADB
  7. JS定义对象方法?
  8. 如何优雅的设计Redux中的Store
  9. MVC5 Entity Framework学习之创建复杂的数据模型
  10. PhpStorm的破解 汉化
  11. django之允许外部机器访问
  12. java框架之MyBatis(1)-入门&amp;动态代理开发
  13. CSS设置DIV边框为圆角,添加背景色溢出的问题
  14. es集群数据库~基本安装
  15. P2P原理及UDP穿透简单说明(转)
  16. 运算类实现 及 GNU Makefile基本结构
  17. [UE4]IsValid方法妙用
  18. selenium自动化测试之整合测试报告
  19. Guice与Spring框架的区别
  20. vue.js 过渡&amp;动画

热门文章

  1. linux 系统下如何进行用户之间的切换
  2. 前端web设置div宽高一样
  3. python 空值(NoneType)
  4. @NOIP2018 - D1T2@ 货币系统
  5. python selenium处理iframe和弹框(一)
  6. 2018-2-13-win10-uwp-获得Slider拖动结束的值
  7. Git的提交与查看差异
  8. CODE FESTIVAL 2017 qual B C 3 Steps(补题)
  9. HMM——维特比算法(Viterbi algorithm)
  10. 用CSS画平行四边形