Russian Qt Forum

Программирование => Общий => Тема начата: Ubuntu_linux от Март 10, 2011, 00:38



Название: Как перегнать QBitArray в QByteArray ?
Отправлено: 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 ?


Название: Re: Как перегнать QBitArray в QByteArray ?
Отправлено: lit-uriy от Март 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;
}
 


Название: Re: Как перегнать QBitArray в QByteArray ?
Отправлено: Ubuntu_linux от Март 12, 2011, 02:26
Почему когда я конвертирую 1 в битовое представления на виходе получается : " 0 0 1 1 0 0 0 1"
Где взялись две единицы?
 ???


Название: Re: Как перегнать QBitArray в QByteArray ?
Отправлено: SimpleSunny от Март 12, 2011, 10:16
Кстати, тут ошибки нет?
if(fromArray[i/8]>>i & 1), может надо было >>(i % 8)


Название: Re: Как перегнать QBitArray в QByteArray ?
Отправлено: brankovic от Март 12, 2011, 10:21
Почему когда я конвертирую 1 в битовое представления на виходе получается : " 0 0 1 1 0 0 0 1"
Где взялись две единицы?
 ???

код единицы в ASCII это 49. То, что в текстовом файле рисуется как 1, на диске лежит как 00110001


Название: Re: Как перегнать QBitArray в QByteArray ?
Отправлено: Ubuntu_linux от Март 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
 


Название: Re: Как перегнать QBitArray в QByteArray ?
Отправлено: IGHOR от Сентябрь 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)));