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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Байты в Биты и обратно  (Прочитано 10082 раз)
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;
}
« Последнее редактирование: Октябрь 20, 2016, 12:46 от Kate » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 20, 2016, 10:20 »

Уважаемые новички

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

Спасибо за понимание
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Октябрь 20, 2016, 12:25 »

http://stackoverflow.com/questions/38160057/convert-qbytearray-to-qbitarray
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Kate
Гость
« Ответ #3 : Октябрь 20, 2016, 12:47 »

Уважаемые новички

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

Спасибо за понимание
Исправила,спасибо.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Октябрь 20, 2016, 13:37 »

Код:
for (int j = 0; j<bitArray.size() / 8; j++)
{
//c = '0';
for (int i = 0; i<bitArray.size(); i++)

Зачем во втором цикле идёте по всему массиву?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 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;
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Октябрь 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;
}
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Октябрь 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)
« Последнее редактирование: Октябрь 21, 2016, 14:36 от deMax » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Октябрь 21, 2016, 15:11 »

Вот так правильно
Правильность зависит исключительно от того, как разработчик представляет QBitArray. Улыбающийся
Я вот представляю его так: 0 бит - соответствует нулевому биту байт, 1ый - первому.

+---+---+---+---+---+
 |  4 |  3 | 2  |  1  |  0  |
+---+---+---+---+---+
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Октябрь 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 ...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Октябрь 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.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #11 : Октябрь 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 порядок будет как у вас.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Октябрь 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  |
+---+---+---+---+---+
                             ^
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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