Russian Qt Forum

Программирование => С/C++ => Тема начата: Kate от Октябрь 20, 2016, 08:52



Название: Байты в Биты и обратно
Отправлено: Kate от Октябрь 20, 2016, 08:52
Не могу разобраться,использую две функции
1.Перевод из байтовой последовательности в битовую
2.Перевод из битовой в байтовую
Для теста строка '1234' и 'data'
Не получается обратного соответствия.
Листинг:
Код:
QBitArray Test::convertBytesToBits(QByteArray fromArray)
{
QBitArray outArray;
outArray.resize(fromArray.size() * 8);//! resize array
for (int i = 0; i<fromArray.count(); ++i)
for (int b = 0; b < 8; ++b)
{
outArray.setBit(i * 8 + b, (fromArray.at(i)&(1 << b)));
}
return outArray;
}
QByteArray Test::convertBitsToBytes(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;
}
функция для убоства проверки побитово
void Test::printBitArray(QBitArray&outArray, QString aComm)
{
QString str = "";
for (int i = 0; i<outArray.size(); i++)
{
if (outArray.testBit(i))
str = str.insert(outArray.size() - i, "1");
else
str = str.insert(outArray.size() - i, "0");
}//for
qDebug()<<aComm<<":" << str;
}


Название: Re: Байты в Биты и обратно
Отправлено: Igors от Октябрь 20, 2016, 10:20
Уважаемые новички

Будьте добры пользоваться тегом для оформления кода. Может чего бы и ответил, но глаза ломать не хочу

Спасибо за понимание


Название: Re: Байты в Биты и обратно
Отправлено: Racheengel от Октябрь 20, 2016, 12:25
http://stackoverflow.com/questions/38160057/convert-qbytearray-to-qbitarray


Название: Re: Байты в Биты и обратно
Отправлено: Kate от Октябрь 20, 2016, 12:47
Уважаемые новички

Будьте добры пользоваться тегом для оформления кода. Может чего бы и ответил, но глаза ломать не хочу

Спасибо за понимание
Исправила,спасибо.


Название: Re: Байты в Биты и обратно
Отправлено: __Heaven__ от Октябрь 20, 2016, 13:37
Код:
for (int j = 0; j<bitArray.size() / 8; j++)
{
//c = '0';
for (int i = 0; i<bitArray.size(); i++)

Зачем во втором цикле идёте по всему массиву?


Название: Re: Байты в Биты и обратно
Отправлено: Igors от Октябрь 21, 2016, 11:32
Код
C++ (Qt)
QByteArray Test::convertBitsToBytes(const  QBitArray & src)
{
QByteArray dst((src.size() + 7) / 8, 0);
 
for (int i = 0; i < src.size(); ++i) {
char & c = dst[i / 8];
if (src.testBit(i))
c |= (1 << (i % 8));
}
return dst;
}


Название: Re: Байты в Биты и обратно
Отправлено: Old от Октябрь 21, 2016, 14:14
Лучше получать ссылку на байт только когда это требуется (установить 1).
Код
C++ (Qt)
QByteArray Test::convertBitsToBytes(const  QBitArray & src)
{
QByteArray dst((src.size() + 7) / 8, 0);
 
for (int i = 0; i < src.size(); ++i) {
if (src.testBit(i))
dst[i / 8] |= (1 << (i % 8));
}
return dst;
}


Название: Re: Байты в Биты и обратно
Отправлено: deMax от Октябрь 21, 2016, 14:23
c |= (1 << (i % 8 ));
Вот так правильно:  c |= (1 << (7 - (i % 8 ))); для "правильного порядка бит" http://stackoverflow.com/questions/38160057/convert-qbytearray-to-qbitarray

(i % 8 ) заменить на (i & 7)


Название: Re: Байты в Биты и обратно
Отправлено: Old от Октябрь 21, 2016, 15:11
Вот так правильно
Правильность зависит исключительно от того, как разработчик представляет QBitArray. :)
Я вот представляю его так: 0 бит - соответствует нулевому биту байт, 1ый - первому.

+---+---+---+---+---+
 |  4 |  3 | 2  |  1  |  0  |
+---+---+---+---+---+


Название: Re: Байты в Биты и обратно
Отправлено: deMax от Октябрь 24, 2016, 09:37
+---+---+---+---+---+
 |  4 |  3 | 2  |  1  |  0  |
+---+---+---+---+---+
поэтому c |= (1 << (7 - (i & 7 ))); чтобы 0b10000000 или 0x80 выглядели в bitarray как ... 1 0 0 0 0 0 0 0 0 ...


Название: Re: Байты в Биты и обратно
Отправлено: Old от Октябрь 24, 2016, 09:41
поэтому c |= (1 << (7 - (i & 7 ))); чтобы 0b10000000 или 0x80 выглядели в bitarray как ... 1 0 0 0 0 0 0 0 0 ...
Нам нужно установить старший 8 бит байта, это i = 7.
Подставляем в ваше выражение и сдвигаем 1 на 0 разрядов.
Получаем 0x01, а не 0x80.


Название: Re: Байты в Биты и обратно
Отправлено: deMax от Октябрь 25, 2016, 12:45
Нам нужно установить старший 8 бит байта, это i = 7.
Подставляем в ваше выражение и сдвигаем 1 на 0 разрядов.
Получаем 0x01, а не 0x80.

QBitArray () << 1 << 0 << 0 << 0 << 0 << 0 << 0 << 0;
Для единицы i==0, он и будет старшим чтобы 0x80 или 0b10000000. Но это все красотульки для вывода, в памяти для little-endian порядок будет как у вас.


Название: Re: Байты в Биты и обратно
Отправлено: Old от Октябрь 25, 2016, 13:19
QBitArray () << 1 << 0 << 0 << 0 << 0 << 0 << 0 << 0;
Для единицы i==0, он и будет старшим чтобы 0x80 или 0b10000000. Но это все красотульки для вывода, в памяти для little-endian порядок будет как у вас.
Для единицы i == 0 и эта единица младшего разряда 0x01 (0b00000001).

+---+---+---+---+---+
 |  4 |  3 | 2  |  1  |  0  |
+---+---+---+---+---+
                             ^