Исправь, если неправильно понял.
Данные хранятся укомплектованно: 4 бита + 4 бита + 4 бита + ... .Ты хочешь считывать именно биты, а не байты (у которых полезная часть - младшая половина).
QBitArray тебе здесь не поможет, он нужен только для хранения данных, а не для потока. А
QBuffer в свою очередь создаётся только на
QByteArray.
Мои рассуждения:
Вариант раз:
Смотрим на интерфейс
QIODevice и видим там непримечательную функцию
ungetChar( char ), которая засунет символ обратно в поток. Идея такова: читаем байт, берём старшую половину, засовуем байт обратно. В следующий раз читаем байт, берём младшую половину и не засовуем обратно. Проблемы:
1. где хранить чётность нечётность уже прочитанных данных?
2. если поток небуферизированный, то ета функция может не работать.
Вариант два:
Наследуемся от
QFile. Получаем
IO Device для работы с 4-мя битами:
class My4BitDevice : public QFile
{
public:
My4BitDevice() :
odd( false )
{
}
qint64 readData( char * data, qint64 maxSize )
{
int count = maxSize;
while ( count )
{
if ( !odd )
{
int bytes = QFile::readData( &tmp, 1 );
if ( bytes < 0 )
return bytes;
if ( bytes != 1 )
return maxSize - count;
}
*data = !odd ? (tmp & 0x0f) : (tmp & 0xf0) >> 4;
odd = !odd;
data++;
count--;
}
return maxSize - count;
}
bool odd;
char tmp;
};
Ну чёта типа такого. Итак, теперь при считывании N байт мы на самом деле считаем N блоков по 4 бита. Результат будет такой: в каждом считанном байте младшая часть и будет наши 4 бита.
Пример использования:
My4BitDevice dev( "myfile" ); // придумаете конструктор
QByteArray bits = dev.read( 10 );
Выше мы считываем 10 блоков по 4 бита. Результат будет в младшей части каждого байта массива
bits. Хотя я бы советовал юзать
qint64 read( char * data, qint64 maxSize ), так можно получить еррор, если биты в файле кончились.