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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу разобраться с QByteArray, прошу помощи  (Прочитано 10513 раз)
SpaceRabbit
Гость
« : Сентябрь 13, 2012, 10:35 »

Здравствуйте, у меня два вопроса:

1) как правильно строковые данные поместить в QByteArray?

есть поле ввода, ввожу туда символы "0x4A 0x4B 0x4C"

Код:
// из строки помещаю в массив
QByteArray ByteMes = pMessage->text().toLocal8Bit();

// тут приходится удалять все все "0x" из строки... как не делать этого?

// из hex в символы не переводит, если не удалить "0x" из строки
QByteArray SymbMes = ByteMes.fromHex(ByteMes);


2) и второй вопрос: в массиве QByteArray записано число 5000 в hex

QByteArray Number;
Number[0] = 0x13;
Nubmber[1] = 0x88;

как из этих двух байтов перевести в целое число типа int, т.е получить 5000

Прошу, помогите пожалуйста новичку.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 13, 2012, 10:39 »

Для таких вещей нужно использовать QDataStream и понимать, что "0x4A 0x4B 0x4C" это строка, а не массив из этих символов.
Записан

Qt 5.11/4.8.7 (X11/Win)
Serr500
Гость
« Ответ #2 : Сентябрь 13, 2012, 10:41 »

1) как правильно строковые данные поместить в QByteArray?
QByteArray & QByteArray::append ( const QString & str )
QByteArray & QByteArray::append ( const char * str )
QByteArray & QByteArray::append ( const char * str, int len )

2) и второй вопрос: в массиве QByteArray записано число 5000 в hex

QByteArray Number;
Number[0] = 0x13;
Nubmber[1] = 0x88;

как из этих двух байтов перевести в целое число типа int, т.е получить 5000
Number[0]*16+Number[1]
Записан
SpaceRabbit
Гость
« Ответ #3 : Сентябрь 13, 2012, 11:40 »

Цитировать
Для таких вещей нужно использовать QDataStream и понимать, что "0x4A 0x4B 0x4C" это строка, а не массив из этих символов.
можно пример, как считать с QLineEdit, у меня ничего не получается

Код:
     
// в QbyteArray из QLineEdit   
ByteMes = pMessage->text().toLocal8Bit();

QDataStream Stream(&ByteMes, QIODevice::ReadWrite);

char *str = NULL;

Stream >> str;

qDebug() << "str = " << (str != NULL ? str : "NULL");

if (str != NULL)
 delete [] str;


Код:
Number[0]*16+Number[1]
не то выводит
« Последнее редактирование: Сентябрь 13, 2012, 11:46 от SpaceRabbit » Записан
Serr500
Гость
« Ответ #4 : Сентябрь 13, 2012, 12:35 »

Код:
Number[0]*16+Number[1]
не то выводит

Упс... Что-то я наврал... И про приведение типов забыл...
Код:
((unsigned char)N[0]) * 0x100 + (unsigned char)N[1]
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 13, 2012, 13:57 »

Начнем со второй задачи
2) и второй вопрос: в массиве QByteArray записано число 5000 в hex

QByteArray Number;
Number[0] = 0x13;
Nubmber[1] = 0x88;

как из этих двух байтов перевести в целое число типа int, т.е получить 5000
У Вас машинное представление "little endian", это означает что младший байт слева, первый. Поэтому правильно
Код
C++ (Qt)
Number[0] = 0x88;
Nubmber[1] = 0x13;
qDebug() << *(short *) &Number[0];
 
Обратите внимание что заполнив 2 байта Вы имеете short. Если нужен int, то
Код
C++ (Qt)
Number[0] = 0x88;
Nubmber[1] = 0x13;
Nubmber[2] = 0x0;
Nubmber[3] = 0x0;
qDebug() << *(int *) &Number[0];
 
Теперь вернемся к первому вопросу. Надо полагать что все введенные числа уместятся в одно число, иначе задача некорректна. Будем считать что это число int, 4 байта. Мне неизвестна ф-ция которая понимает 0x, поэтому я бы сделал так

Код
C++ (Qt)
void ConvertHex( const QString & src, QByteArray & dst )
{
dst.clear();
QStringList lst = src.split("0x", QString::SkipEmptyParts);
 
// заполняем с младшего
 bool Ok = true;
 for (int i = lst.size() - 1; i >= 0; --i) {
  unsigned int temp = lst[i].toUInt(&Ok, 16);
 
// одно число должно быть < 256 (00..FF)
  if (!Ok || temp > 255) {
   qDebug() << "Invalid input:" << lst[i];
   return;
 }  
 
// слишком много чисел
 if (temp && dst.size() >=  4) {
   qDebug() << "String is too long" ;
   return;
 }  
 
 dst.push_back((char) temp);
}
 
// доливаем до 4 байтов
while (dst.size() < 4)
  dst.push_back((char) 0);
 
// проверка
   qDebug() << "Result" << dst.toInt();
}
 
Писал прямо здесь, возможны ошибки
« Последнее редактирование: Сентябрь 13, 2012, 14:18 от Igors » Записан
andrew.k
Гость
« Ответ #6 : Сентябрь 13, 2012, 17:36 »

Если "0х" программой никак не используется, если кроме 0х других вариантов нет, то зачем заставлять пользователя вводить это?
Нужно написать: "Введите данные в шестнадцатиричном виде". И все.
А дальше
Код
C++ (Qt)
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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