Название: Побитовое чтение файла Отправлено: 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 Цитировать Как мне просто считать файл, рассматривая его как последовательность битов, независимо от того, как он писался и что в нем? Читай побайтно, а байты разберёшь.я делал так: Код
Название: Re: Побитовое чтение файла Отправлено: fulkabaster от Январь 02, 2010, 16:25 Не, я не догоняю.... Зачем усложнять, если в описании QBitArray есть операторы >> и <<, пихающие QBitArray в определенном формате в/из QDataStream.
Как я понимаю, если я хочу записать в файл QBitArray, то это должно выглядеть примерно так: Код
Компилятор не ругается, код запускается. Но созданный файл всегда пуст.... Название: Re: Побитовое чтение файла Отправлено: developer от Январь 02, 2010, 17:08 Несовсем, а кто будет читать файл в цикле. То есть, ты открыл файл, а теперь нужно читать из него, нужное тебе количество байт, ето делает функция read(), ты либо читаэш небольшоэколичесто байт пока не наступит колнец файла, или читаеш все сразу.
Название: Re: Побитовое чтение файла Отправлено: fulkabaster от Январь 02, 2010, 17:54 Блин, в теме уже почти десяток ответов, а прояснилось - ноль :(
To developer: Я принципиально не понимаю, о каком цикле речь. Если я хочу читать побитно, это не значит, что я буду читать биты в цикле, т.к. файл в любом случвае читается байтами. Здравый смысл и описание форматов для QDataStream подсказывает, что операция >> применяется к QBitArray единожды. При этом сначала считывается размер объекта QBitArray, а затем он сам, в соответствии с этим размером. Но либо мой здравый смысл не такой уж здравый, либо одно из двух... Название: Re: Побитовое чтение файла Отправлено: uriel от Январь 02, 2010, 21:49 Блин, в теме уже почти десяток ответов, а прояснилось - ноль :( Здравый смысл у Вас в порядке, а вот знание C++ не очень. :)To developer: Я принципиально не понимаю, о каком цикле речь. Если я хочу читать побитно, это не значит, что я буду читать биты в цикле, т.к. файл в любом случвае читается байтами. Здравый смысл и описание форматов для QDataStream подсказывает, что операция >> применяется к QBitArray единожды. При этом сначала считывается размер объекта QBitArray, а затем он сам, в соответствии с этим размером. Но либо мой здравый смысл не такой уж здравый, либо одно из двух... Вы объявляете file как указатель и выделяете под него память в куче, да только вот освободить забываете. Либо делайте file->close() и освобождайте где-нибудь в другом месте, либо сразу delete file - тогда все ресурсы будут благополучно освобождены и файл получит свой законный размер в 17 байт. ;) Название: Re: Побитовое чтение файла Отправлено: Igors от Январь 02, 2010, 22:07 Блин, в теме уже почти десяток ответов, а прояснилось - ноль :( Да бывает у девушки муж помирает - а у вдовы живет :)Я принципиально не понимаю, о каком цикле речь. Если я хочу читать побитно, это не значит, что я буду читать биты в цикле, т.к. файл в любом случвае читается байтами. Минимальная единица информации - байт, меньше нет. Др. дело что внутри байта Вы можете крутить битами как хотите, паковать и.т.п. Отталкивайтесь от этого, должно полегчать. Операции << и >> никакого отношения к битам не имеют, это просто перекрытые операторы I/OЗдравый смысл и описание форматов для QDataStream подсказывает, что операция >> применяется к QBitArray единожды. При этом сначала считывается размер объекта QBitArray, а затем он сам, в соответствии с этим размером. Но либо мой здравый смысл не такой уж здравый, либо одно из двух... Название: 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). |