Russian Qt Forum

Qt => Общие вопросы => Тема начата: fulkabaster от Июнь 05, 2009, 16:21



Название: Побитовое чтение файла
Отправлено: fulkabaster от Июнь 05, 2009, 16:21
Задача - прочитать файл не байтами, а битами. Нашел класс QBitArray, и даже оператор >> , пишущий в него из QDataStream. Написал тестовую программку, но так и не понял, как с ним работать. После операции
QDataStream >> QBitArray последний всегда имеет размер 0. Подскажите, пожалуйста, как его юзать для цели побитового чтения файла (либо любой другой метод).


Название: Re: Побитовое чтение файла
Отправлено: Rcus от Июнь 05, 2009, 16:25
Читать дальше: Format of the QDataStream Operators
Цитировать
QBitArray   
The array size (quint32)
The array bits, i.e. (size + 7)/8 bytes


Название: Re: Побитовое чтение файла
Отправлено: fulkabaster от Июнь 06, 2009, 07:46
Не догоняю :(
Сначала нужно считать quint32, а потом QBitArray?

Подскажите просто, как будет выглядеть операция считывания из файла в QBitArray?


Название: Re: Побитовое чтение файла
Отправлено: Rcus от Июнь 06, 2009, 07:55
Если файл не слишком большой(<2^28 байт) то можно считать его в QByteArray, добавить в начало его длину (в bigendian) и через QBuffer подать в QDataStream :)


Название: Re: Побитовое чтение файла
Отправлено: fulkabaster от Июнь 07, 2009, 17:01
Теперь задачка свелась к тому, как прочитать из QDataStream в QByteArray  ;D
Там ведь та же схема:
Цитировать
QByteArray
If the byte array is null: 0xFFFFFFFF (quint32)
Otherwise: the array size (quint32) followed by the array bytes, i.e. size bytes

Я правильно понимаю, что считать файл можно в определенном формате только если он записан был в этом же формате? Как мне просто считать файл, рассматривая его как последовательность битов, независимо от того, как он писался и что в нем?


Название: Re: Побитовое чтение файла
Отправлено: lit-uriy от Июнь 07, 2009, 18:07
Цитировать
Как мне просто считать файл, рассматривая его как последовательность битов, независимо от того, как он писался и что в нем?
Читай побайтно, а байты разберёшь.
я делал так:
Код
C++ (Qt)
QFile src
char *c;
int len;
char data[255];
bool ok;
len = 0;
while(1){
ok = (src.getChar(c) && c);
if (!ok) break;
Debug() << "Read:\t" << QByteArray::fromRawData (c, 1).toHex()
<< "\tlen" << len;
data[len] = *c;
++len;
if (len == maxlen) break;
}
 


Название: Re: Побитовое чтение файла
Отправлено: fulkabaster от Январь 02, 2010, 16:25
Не, я не догоняю.... Зачем усложнять, если в описании QBitArray есть операторы >> и <<, пихающие QBitArray  в определенном формате в/из QDataStream.

Как я понимаю, если я хочу записать в файл QBitArray, то это должно выглядеть примерно так:

Код
C++ (Qt)
QBitArray *ba = new QBitArray(100, false);
 
QFile *file = new QFile("out");
if (!file->open(QIODevice::WriteOnly)) {
cerr << "Can not create file" << endl;
return;
}
 
QDataStream *outstream = new QDataStream(file);
 
*outstream << *ba;

Компилятор не ругается, код запускается. Но созданный файл всегда пуст....


Название: Re: Побитовое чтение файла
Отправлено: developer от Январь 02, 2010, 17:08
Несовсем, а кто будет читать файл в цикле. То есть, ты открыл файл, а теперь нужно читать из него, нужное тебе количество байт, ето делает функция read(), ты либо читаэш небольшоэколичесто байт пока не наступит колнец файла, или читаеш все сразу.


Название: Re: Побитовое чтение файла
Отправлено: fulkabaster от Январь 02, 2010, 17:54
Блин, в теме уже почти десяток ответов, а прояснилось - ноль  :(

To developer:
Я принципиально не понимаю, о каком цикле речь. Если я хочу читать побитно, это не значит, что я буду читать биты в цикле, т.к. файл в любом случвае читается байтами.
Здравый смысл и описание форматов для QDataStream подсказывает, что операция >> применяется к QBitArray единожды. При этом сначала считывается размер объекта QBitArray, а затем он сам, в соответствии с этим размером.
Но либо мой здравый смысл не такой уж здравый, либо одно из двух...


Название: Re: Побитовое чтение файла
Отправлено: uriel от Январь 02, 2010, 21:49
Блин, в теме уже почти десяток ответов, а прояснилось - ноль  :(

To developer:
Я принципиально не понимаю, о каком цикле речь. Если я хочу читать побитно, это не значит, что я буду читать биты в цикле, т.к. файл в любом случвае читается байтами.
Здравый смысл и описание форматов для QDataStream подсказывает, что операция >> применяется к QBitArray единожды. При этом сначала считывается размер объекта QBitArray, а затем он сам, в соответствии с этим размером.
Но либо мой здравый смысл не такой уж здравый, либо одно из двух...
Здравый смысл у Вас в порядке, а вот знание C++ не очень. :)
Вы объявляете file как указатель и выделяете под него память в куче, да только вот освободить забываете. Либо делайте file->close() и освобождайте где-нибудь в другом месте, либо сразу delete file - тогда все ресурсы будут благополучно освобождены и файл получит свой законный размер в 17 байт. ;)


Название: Re: Побитовое чтение файла
Отправлено: Igors от Январь 02, 2010, 22:07
Блин, в теме уже почти десяток ответов, а прояснилось - ноль  :(
Да бывает у девушки муж помирает - а у вдовы живет  :)

Я принципиально не понимаю, о каком цикле речь. Если я хочу читать побитно, это не значит, что я буду читать биты в цикле, т.к. файл в любом случвае читается байтами.
Здравый смысл и описание форматов для QDataStream подсказывает, что операция >> применяется к QBitArray единожды. При этом сначала считывается размер объекта QBitArray, а затем он сам, в соответствии с этим размером.
Но либо мой здравый смысл не такой уж здравый, либо одно из двух...
Минимальная единица информации - байт, меньше нет. Др. дело что внутри байта Вы можете крутить битами как хотите, паковать и.т.п. Отталкивайтесь от этого, должно полегчать. Операции << и >> никакого отношения к битам не имеют, это просто перекрытые операторы I/O


Название: Re: Побитовое чтение файла
Отправлено: fulkabaster от Январь 06, 2010, 10:20
Цитировать
Вы объявляете file как указатель и выделяете под него память в куче, да только вот освободить забываете. Либо делайте file->close() и освобождайте где-нибудь в другом месте, либо сразу delete file - тогда все ресурсы будут благополучно освобождены и файл получит свой законный размер в 17 байт.
Да, моя ошибка. Теперь вроде работает. Спасибо.

Цитировать
Минимальная единица информации - байт, меньше нет. Др. дело что внутри байта Вы можете крутить битами как хотите, паковать и.т.п. Отталкивайтесь от этого, должно полегчать. Операции << и >> никакого отношения к битам не имеют, это просто перекрытые операторы I/O
Я в общем-то не программер по профессии, но то, что операторы << и >>  бывают для работы с битами, и бывают независимо для работы с I/O, я знаю давно :) И что байт - минимальная единица инфы - тоже. Просто сам смысл класса QBitArray состоит в том, что про это можно забыть :)


Название: Re: Побитовое чтение файла
Отправлено: Igors от Январь 06, 2010, 16:24
Я в общем-то не программер по профессии, но то, что операторы << и >>  бывают для работы с битами, и бывают независимо для работы с I/O, я знаю давно :) И что байт - минимальная единица инфы - тоже. Просто сам смысл класса QBitArray состоит в том, что про это можно забыть :)
Ну если Вы уже так много знаете - так это еще лучше  :)  Если (как я понял) Вы хотите представить число/значение более короткой комбинацией бит - то от QBitArray Вам не помощи никакой потому что он умеет работать только с 1 битом (как boolean).