Russian Qt Forum

Qt => Общие вопросы => Тема начата: SpaceRabbit от Сентябрь 13, 2012, 10:35



Название: Не могу разобраться с QByteArray, прошу помощи
Отправлено: 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

Прошу, помогите пожалуйста новичку.


Название: Re: Не могу разобраться с QByteArray, прошу помощи
Отправлено: GreatSnake от Сентябрь 13, 2012, 10:39
Для таких вещей нужно использовать QDataStream и понимать, что "0x4A 0x4B 0x4C" это строка, а не массив из этих символов.


Название: Re: Не могу разобраться с QByteArray, прошу помощи
Отправлено: Serr500 от Сентябрь 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]


Название: Re: Не могу разобраться с QByteArray, прошу помощи
Отправлено: SpaceRabbit от Сентябрь 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]
не то выводит


Название: Re: Не могу разобраться с QByteArray, прошу помощи
Отправлено: Serr500 от Сентябрь 13, 2012, 12:35
Код:
Number[0]*16+Number[1]
не то выводит

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


Название: Re: Не могу разобраться с QByteArray, прошу помощи
Отправлено: Igors от Сентябрь 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();
}
 
Писал прямо здесь, возможны ошибки


Название: Re: Не могу разобраться с QByteArray, прошу помощи
Отправлено: andrew.k от Сентябрь 13, 2012, 17:36
Если "0х" программой никак не используется, если кроме 0х других вариантов нет, то зачем заставлять пользователя вводить это?
Нужно написать: "Введите данные в шестнадцатиричном виде". И все.
А дальше
Код
C++ (Qt)
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"