• 6344阅读
  • 6回复

到底怎样才能把二进制文件的数据读到QBitArray里面啊,我都要疯了 [复制链接]

上一主题 下一主题
离线356458089
 
只看楼主 倒序阅读 楼主  发表于: 2013-05-02


我的软件需要读取二进制文件中的数据,进行按位编辑,所以用QBitArray最合适,但是我看文档还是去google,怎么也没找到能正确读入的方式
网络上提供的方式反而把QBitArray的size变成了我要编辑的数字...
比如hex是0x80bf,然后size就成了49024....实在是莫名其妙

  1.     QFile rw_file;
  2.     rw_file.setFileName(rw_file_path);
  3.     rw_file.open(rw_file.ReadOnly);
  4.     rw_file.seek(pos);
  5.     QDataStream rw_file_stream(&rw_file);
  6.     rw_file_stream.setVersion(rw_file_stream.Qt_5_0);
  7.     rw_file_stream.setByteOrder(rw_file_stream.LittleEndian);
  8.     QBitArray data(7);
  9.     
  10.     rw_file_stream >> data;
  11.     
  12.     qDebug() << data.size();


执行结果就是49024....真是无语了

前阵子翻到别人一段代码
  1.     QFile file(rw_file_path);
  2.     QByteArray ba;
  3.     QBitArray bar(8000);
  4.     if ( file.open (QIODevice::ReadOnly))
  5.     {
  6.     qDebug() << "File was read";
  7.     ba = file.readAll();
  8.     }
  9.     file.close();
  10.     QDataStream in(ba);
  11.     qDebug() << "Size of QBitArray: " << bar.size();
  12.     operator>>(in,bar);
  13.     qDebug() << "Size of QBitArray: " << bar.size();


执行结果就是
File was read
Size of QBitArray:  8000
Size of QBitArray:  0

为什么数据流读入数据会改变QBitArray的大小?? 难道是bug?
前阵子也是,写入文件要是用writeonly的话竟然会把文件先清空再写入.手册上并不是这么说的,各种莫名其妙
离线dbzhang800

只看该作者 1楼 发表于: 2013-05-02
不妨先去看看QDataStream的manual,然后你就清楚为何会如此了
离线356458089
只看该作者 2楼 发表于: 2013-05-02
引用第1楼dbzhang800于2013-05-02 15:37发表的  :
不妨先去看看QDataStream的manual,然后你就清楚为何会如此了


那个我看了..不过filemode是在qfile里定义的吧,qfile里好像压根也没说用writeonly打开会清空文件啊,如果会清空还提供t什么开头的那个选项干嘛...

嘛,本帖这问题算是解决了吧,我也不打算用qbitarray来直接处理了,实在是太麻烦,从昨天半夜搞到现在,就是没写进去
= =...干脆去自己的单片机模拟spi的库里copy一段就搞定了...现在只拿他传参....受不了了

qt很多时候真心浇灭我的兴趣

  1. QBitArray MainWindow::savedata_binary_read_quint8_to_QBitArray(QString rw_file_path, qint64 pos)
  2. {
  3.     QFile rw_file;
  4.     rw_file.setFileName(rw_file_path);
  5.     rw_file.open(rw_file.ReadOnly);
  6.     rw_file.seek(pos);
  7.     QDataStream rw_file_stream(&rw_file);
  8.     rw_file_stream.setVersion(rw_file_stream.Qt_5_0);
  9.     rw_file_stream.setByteOrder(rw_file_stream.LittleEndian);
  10.     quint8 data_u8;
  11.     rw_file_stream >> data_u8;
  12.     rw_file.close();
  13.     QBitArray data;
  14.     data.resize(8);
  15.     data.fill(false);
  16.     qDebug() << data_u8;
  17.     for (int i = 0;i < 8;i++)
  18.     {
  19.         if (data_u8 & (0x80 >> i))//高位在前,低位在前改为(0x01<<i)
  20.         {
  21.             data.setBit(i);
  22.             qDebug() << data.at(i);
  23.         }
  24.         else
  25.         {
  26.             data.clearBit(i);
  27.             qDebug() << data.at(i);
  28.         }
  29.     }
  30.     return data;
  31. }

离线dbzhang800

只看该作者 3楼 发表于: 2013-05-02
1.  不论是C,C++,Python,用只写模式打开文件时,都会先清空文件

2.  使用 QDataStream,你第一步需要了解的它对格式又什么要求。
比如,对于QBitArray,Manual中提到:

QBitArray    
The array size (quint32)
The array bits, i.e. (size + 7)/8 bytes

也就是说,你想用QDataStream读进来一个QBitArray,那么你提供的数据必须是4字节的长度信息+原始数据信息。
离线356458089
只看该作者 4楼 发表于: 2013-05-02
引用第3楼dbzhang800于2013-05-02 15:57发表的  :
1.  不论是C,C++,Python,用只写模式打开文件时,都会先清空文件
2.  使用 QDataStream,你第一步需要了解的它对格式又什么要求。
比如,对于QBitArray,Manual中提到:
.......


能不能给一段示例代码
QBitArray    
The array size (quint32)
The array bits, i.e. (size + 7)/8 bytes
这几句话我早就看到了...但是一直没明白到底要怎么写
离线dbzhang800

只看该作者 5楼 发表于: 2013-05-02
引用第4楼356458089于2013-05-02 16:12发表的  :
能不能给一段示例代码
QBitArray    
The array size (quint32)
.......

只要你的数据符合格式,你前面贴的代码应该就可以用吧?

如果你对格式要求比较迷惑,那么通过QDataStream将一个自己构造的QBitArray写入到文件,然后用16进制编辑器查看该文件即可。
离线356458089
只看该作者 6楼 发表于: 2013-05-02
引用第5楼dbzhang800于2013-05-02 16:41发表的  :
只要你的数据符合格式,你前面贴的代码应该就可以用吧?
如果你对格式要求比较迷惑,那么通过QDataStream将一个自己构造的QBitArray写入到文件,然后用16进制编辑器查看该文件即可。



好的,一会去试试,主要就是格式比较迷惑
快速回复
限100 字节
 
上一个 下一个