Russian Qt Forum
Май 15, 2024, 07:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Побитовое чтение файла  (Прочитано 17325 раз)
fulkabaster
Гость
« : Июнь 05, 2009, 16:21 »

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

Читать дальше: Format of the QDataStream Operators
Цитировать
QBitArray   
The array size (quint32)
The array bits, i.e. (size + 7)/8 bytes
Записан
fulkabaster
Гость
« Ответ #2 : Июнь 06, 2009, 07:46 »

Не догоняю Грустный
Сначала нужно считать quint32, а потом QBitArray?

Подскажите просто, как будет выглядеть операция считывания из файла в QBitArray?
Записан
Rcus
Гость
« Ответ #3 : Июнь 06, 2009, 07:55 »

Если файл не слишком большой(<2^28 байт) то можно считать его в QByteArray, добавить в начало его длину (в bigendian) и через QBuffer подать в QDataStream Улыбающийся
Записан
fulkabaster
Гость
« Ответ #4 : Июнь 07, 2009, 17:01 »

Теперь задачка свелась к тому, как прочитать из QDataStream в QByteArray  Смеющийся
Там ведь та же схема:
Цитировать
QByteArray
If the byte array is null: 0xFFFFFFFF (quint32)
Otherwise: the array size (quint32) followed by the array bytes, i.e. size bytes

Я правильно понимаю, что считать файл можно в определенном формате только если он записан был в этом же формате? Как мне просто считать файл, рассматривая его как последовательность битов, независимо от того, как он писался и что в нем?
« Последнее редактирование: Июнь 07, 2009, 17:03 от fulkabaster » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июнь 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;
}
 
Записан

Юра.
fulkabaster
Гость
« Ответ #6 : Январь 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;

Компилятор не ругается, код запускается. Но созданный файл всегда пуст....
« Последнее редактирование: Январь 02, 2010, 16:29 от fulkabaster » Записан
developer
Гость
« Ответ #7 : Январь 02, 2010, 17:08 »

Несовсем, а кто будет читать файл в цикле. То есть, ты открыл файл, а теперь нужно читать из него, нужное тебе количество байт, ето делает функция read(), ты либо читаэш небольшоэколичесто байт пока не наступит колнец файла, или читаеш все сразу.
Записан
fulkabaster
Гость
« Ответ #8 : Январь 02, 2010, 17:54 »

Блин, в теме уже почти десяток ответов, а прояснилось - ноль  Грустный

To developer:
Я принципиально не понимаю, о каком цикле речь. Если я хочу читать побитно, это не значит, что я буду читать биты в цикле, т.к. файл в любом случвае читается байтами.
Здравый смысл и описание форматов для QDataStream подсказывает, что операция >> применяется к QBitArray единожды. При этом сначала считывается размер объекта QBitArray, а затем он сам, в соответствии с этим размером.
Но либо мой здравый смысл не такой уж здравый, либо одно из двух...
Записан
uriel
Гость
« Ответ #9 : Январь 02, 2010, 21:49 »

Блин, в теме уже почти десяток ответов, а прояснилось - ноль  Грустный

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

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Январь 02, 2010, 22:07 »

Блин, в теме уже почти десяток ответов, а прояснилось - ноль  Грустный
Да бывает у девушки муж помирает - а у вдовы живет  Улыбающийся

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

Цитировать
Вы объявляете file как указатель и выделяете под него память в куче, да только вот освободить забываете. Либо делайте file->close() и освобождайте где-нибудь в другом месте, либо сразу delete file - тогда все ресурсы будут благополучно освобождены и файл получит свой законный размер в 17 байт.
Да, моя ошибка. Теперь вроде работает. Спасибо.

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

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Январь 06, 2010, 16:24 »

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


Страница сгенерирована за 0.094 секунд. Запросов: 22.