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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QBitArray  (Прочитано 10389 раз)
Kate
Гость
« : Февраль 12, 2012, 23:41 »

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

При такой записи выводит ошибку переполнения массива.
QBitArray ba(200);
...
QBitArray time_s(13);
int f=0;

for (int l = 0; l < 12; ++l){
            time_s[f++]=ba[l];

}

и можно ли настроить отладчик,чтобы отображал данные в массиве побитно,а не побайтно?
Записан
andrew.k
Гость
« Ответ #1 : Февраль 13, 2012, 11:07 »

QBitArray & QBitArray::operator= ( const QBitArray & other )

Assigns other to this bit array and returns a reference to this bit array.

Стало быть.
Код
C++ (Qt)
time_s = ba;
time_s.truncate(12);
Записан
Kate
Гость
« Ответ #2 : Февраль 13, 2012, 13:27 »

Это решает проблему,если нужны 1е элементы.А как быть,если нужна часть массива.Например с 12го бита до 32го?

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 13, 2012, 13:37 »

Это решает проблему,если нужны 1е элементы.А как быть,если нужна часть массива.Например с 12го бита до 32го?
Код
C++ (Qt)
int CopyFrom( const QBitArray & src, QBitArray & dst, int srcBeg, int srcEnd, int dstBeg = 0 )
{
srcBeg = qMin(srcBeg, src.size());
srcEnd = qMin(srcEnd, src.size());
if (srcBeg >= srcEnd) return 0;
int dstSize = dstBeg + srcEnd - srcBeg;
if (dstSize > dst.size()) dst.resize(dstSize);
for (int i = srcBeg; i < srcEnd; ++i)
 dst[dstBeg++] = src[i];
return srcBeg - srcEnd;
}
 
Записан
Kate
Гость
« Ответ #4 : Февраль 15, 2012, 19:24 »

Вот теперь только проблема,что данные неверно записываются.Если считывать весь файл побитно в один большой массив,а потом уже из него записывать поразрядно в массивы поменьше,записываются не те данные,кот были в большом файле.Не понятно почему так происходит.Если смотреть в отладчике,вместо [8,1,е] записывается [с,1,d]. Помогите разобраться. Изначально был дан двоичный файл.Из него необходимо считать 12 разрядов (0-11)-это секунды,затем 20 разрядов(12-32)-это микросекунды.

На данный момент код выглядит так:

int CopyFrom( const QBitArray & src, QBitArray & dst, int srcBeg, int srcEnd, int dstBeg = 0 )
{
 srcBeg = qMin(srcBeg, src.size());
 srcEnd = qMin(srcEnd, src.size());
 if (srcBeg >= srcEnd) return 0;
 int dstSize = dstBeg + srcEnd - srcBeg;
 if (dstSize > dst.size()) dst.resize(dstSize);
 for (int i = srcBeg; i < srcEnd; ++i)
  dst[dstBeg++] = src;
 return srcBeg - srcEnd;
}

void MainWindow::on_pushButton_clicked()
{
String fileName=QFileDialog::getOpenFileName(this, tr("Open File"),
                                                     "C:/ ",
                                                     tr("Files (*.a1311 *.c1211 *.s1311 *.txt)"));

QFile file1(fileName);
QFile file2("C:/72.txt");

QBitArray ba;

if (file1.open(QIODevice::ReadOnly)){
    qint64 sizeBytes = file1.size();
    if (sizeBytes) {
        char * temp = new char[sizeBytes];
        file1.read(temp, sizeBytes);
        ba.resize(sizeBytes * Крутой;
        for (int i = 0; i < sizeBytes; ++i)//отсчитывает количество байт
            for (int j = 0; j < 8; ++j)//для побитной записи файла
                ba.setBit(i * 8 + j, (temp >> j) & 1);
        delete [] temp;
    }
}

QBitArray time_s(12);
QBitArray time_ms(20);

int CopyFrom(ba,time_s,0,12,0);
int CopyFrom(ba,time_ms,12,32,0);

file1.close();
}




 

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Февраль 15, 2012, 19:31 »

для вставки кода есть тэг code (а если написать code=cpp в открытии тега, то вывод будет красивым)
Код
C++ (Qt)
int CopyFrom(ba,time_s,0,12,0);
int CopyFrom(ba,time_ms,12,32,0);
зачем тут int впереди?

а ошибка во втором вызове в последнем параметре - там должна стоять 12 а не 0
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гость
« Ответ #6 : Февраль 15, 2012, 19:33 »

Вот мы и узнали, где собака зарыта)))
Итого нужно считать из файла один int и два раза поANDить например)
« Последнее редактирование: Февраль 15, 2012, 19:36 от andrew.k » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Февраль 15, 2012, 20:02 »

а ошибка во втором вызове в последнем параметре - там должна стоять 12 а не 0
а не, это моя невнимательность, вызов написан правильно.
Итого нужно считать из файла один int и два раза поANDить например)
int же на системах разной разрядности будет разной величины
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
_OLEGator_
Гость
« Ответ #8 : Февраль 15, 2012, 21:15 »

to kambala
Код
C++ (Qt)
qint8
qint16
qint32
qint64

Как бэ должны гарантировать разрядность int
Записан
andrew.k
Гость
« Ответ #9 : Февраль 15, 2012, 21:16 »

а ошибка во втором вызове в последнем параметре - там должна стоять 12 а не 0
а не, это моя невнимательность, вызов написан правильно.
Итого нужно считать из файла один int и два раза поANDить например)
int же на системах разной разрядности будет разной величины
ну я же условно. это ж похоже лабораторная работа.
Записан
Kate
Гость
« Ответ #10 : Февраль 15, 2012, 23:03 »

Не понятно где и как прописать тег code.Но видимо дело не в красивом выводе,а что оно считывает биты как-то странно.
Нет,это не лаба,увы,это задание по работе и первая попытка реализовать что-то в QT(
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Февраль 15, 2012, 23:37 »

процитируй чьё-нибудь сообщение с кодом и увидишь как пользоваться тегом

temp >> j - у меня такое даже не компилируется. а что эта запись должна делать? брать текущий char из массива и сдвигать его на нужное количество? тогда может
Код:
temp[i]
?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Kate
Гость
« Ответ #12 : Февраль 15, 2012, 23:47 »

Да
Код:
temp[i]
.Без тегов не прописывалось как надо)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Февраль 15, 2012, 23:59 »

скорее всего биты просто читаются в обратном порядке, т.к. сам код по идее правильный. попробуй записывать биты в обратном порядке:
Код
C++ (Qt)
ba.setBit((i+1) * 8 - j - 1, (temp[i] >> j) & 1);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Февраль 16, 2012, 01:14 »

Изначально был дан двоичный файл.Из него необходимо считать 12 разрядов (0-11)-это секунды,затем 20 разрядов(12-32)-это микросекунды.
Зачем тогда QBitArray?

Код
C++ (Qt)
qint32 packedTime;
// читаем из файла
 
int seconds = packedTime & 0xFFF;
int msecs = (packedTime >> 12) & 0xFFFFF;
 
Общепринято что разряды идут справа налево, напр 0x0001 - единичка в нулевом разряде
« Последнее редактирование: Февраль 16, 2012, 13:43 от Igors » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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