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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как перегнать QBitArray в QByteArray ?  (Прочитано 11485 раз)
Ubuntu_linux
Гость
« : Март 10, 2011, 00:38 »

Как перегнать QBitArray в QByteArray  ?

Собственно обратно понятно как конвертировать, я делаю так:
Код
C++ (Qt)
QBitArray DallasOneWire::toBitArray(QByteArray fromArray){
QBitArray outArray;
outArray.resize(fromArray.size()*8);//! resize array
for(int i=0;i<outArray.size();i++){
   if(fromArray[i/8]>>i & 1){outArray.setBit(i,true);}
}//for i
qDebug()<<"out BitArray: ";  //! out array for controll
for(int i=0;i<outArray.size();i++){
   if(outArray[i]==true){qDebug()<<"1";}else{qDebug()<<"0";}
}//for
return outArray;
}//toBitArray

Но как конвертировать QBitArray в QByteArray ?
« Последнее редактирование: Март 10, 2011, 00:46 от Ubuntu_linux » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Март 10, 2011, 20:00 »

Примерно так
Код
C++ (Qt)
QByteArray convert(const QBitArray &in)
{
   QByteArray out;
   int bitIndex = 0, byteIndex = 0;
   int bitCount = in.size();
   while(bitIndex < bitCount){
       char c;
       if (in[i])
           c |= ( 1 << byteIndex);
       if (byteIndex >= 7){
           byteIndex = 0;
           out.append(c);
           c = 0;
       }
   }
   return out;
}
 
Записан

Юра.
Ubuntu_linux
Гость
« Ответ #2 : Март 12, 2011, 02:26 »

Почему когда я конвертирую 1 в битовое представления на виходе получается : " 0 0 1 1 0 0 0 1"
Где взялись две единицы?
 Непонимающий
Записан
SimpleSunny
Гость
« Ответ #3 : Март 12, 2011, 10:16 »

Кстати, тут ошибки нет?
if(fromArray[i/8]>>i & 1), может надо было >>(i % Крутой
Записан
brankovic
Гость
« Ответ #4 : Март 12, 2011, 10:21 »

Почему когда я конвертирую 1 в битовое представления на виходе получается : " 0 0 1 1 0 0 0 1"
Где взялись две единицы?
 Непонимающий

код единицы в ASCII это 49. То, что в текстовом файле рисуется как 1, на диске лежит как 00110001
Записан
Ubuntu_linux
Гость
« Ответ #5 : Март 12, 2011, 11:41 »

Спасибо, понятно. Подмигивающий я  так и подозревал, так как обратная конвертация в байт дает правильней результат.

Вот функции которые я использую:
Код
C++ (Qt)
QByteArray DallasOneWire::toByteArray(QBitArray bitArray){
   QByteArray byteArray;
   char c;
     qDebug()<<"bitArraySize= ";
     qDebug()<<(int)bitArray.size();
 
     for(int j=0;j<bitArray.size()/8;j++){
     c='0';
       for(int i=0;i<bitArray.size();i++){if (bitArray.testBit(i)){ c |= ( 1 << i);} }//! convert bit array to byte array
      byteArray.append(c);
  }
      qDebug()<<"Byte after: ";
      qDebug()<<byteArray;
return byteArray;
}//toBitArray
 
QBitArray DallasOneWire::toBitArray(QByteArray fromArray){
QBitArray outArray;
outArray.resize(fromArray.size()*8);//! resize array
for(int i=0;i<outArray.size();i++){
   if(fromArray[i/8]>>i & 1){outArray.setBit(i,true);}
}//for i
qDebug()<<"out BitArray: ";  //! out array for controll
QString str="";
for(int i=0;i<outArray.size();i++){
  // if(outArray.testBit(i)){qDebug()<<1;}else{qDebug()<<0;}
   if(outArray.testBit(i)){str=str.insert(outArray.size()-i,"1");}else{str=str.insert(outArray.size()-i,"0");}
 
}//for
qDebug()<<str;
return outArray;
}//toBitArray
 
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #6 : Сентябрь 07, 2012, 15:39 »

Может кому-то пригодиться.

Конвертация QByteArray -> QBitArray

Код:
QByteArray bytes = ...;
 
// Create a bit array of the appropriate size
QBitArray bits(bytes.count()*8);
 
// Convert from QByteArray to QBitArray
for(int i=0; i<bytes.count(); ++i)
    for(int b=0; b<8; ++b)
        bits.setBit(i*8+b, bytes.at(i)&(1<<b));

Обратная конвертация QBitArray -> QByteArray

Код:
QBitArray bits = ...;
 
// Resulting byte array
QByteArray bytes;
 
// Convert from QBitArray to QByteArray
for(int b=0; b<bits.count(); ++b)
    bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(b%8)));
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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