Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ADA от Июль 18, 2011, 17:24



Название: Как преобразовать из ASCII в char и отправить по UDP
Отправлено: ADA от Июль 18, 2011, 17:24
Доброго времени суток, форумчане.
Бьюсь над данной проблемой уже неск. дней.
Что сделано =
Код
C++ (Qt)
QString lines;
lines = sentText->toPlainText();
QStringList numbers = lines.split(QRegExp("[, \n\r]+"));
lines = numbers[0+readlnum] + numbers[1+readlnum] +
             numbers[2+readlnum] + numbers[3+readlnum] +
             numbers[4+readlnum];
QByteArray datagramm;
QByteArray datagramm = lines.toStdString().c_str();
TxudpSocket->writeDatagram(datagramm.data(), datagramm.size(),QHostAddress::LocalHost, TxPort.toInt());
 
Естественно данные по UDP пересылаются в ASCII.

Xотелось бы как-то преобразовать те 5 байт из строки, которые я выделяю в char и передать их по UDP уже в виде char-ов, а не в виде ASCII.
Подскажите, как мне это сделать, пожалуйста.

ЗЫ: Всем отозвавшимся заранее спасибо  ;)


Название: Re: Как преобразовать из ASCII в char и отправить по UDP
Отправлено: LisandreL от Июль 18, 2011, 20:47
Код:
Естественно данные по UDP пересылаются в ASCII.
Что в этом естественного?

Код:
 lines = numbers[0+readlnum] + numbers[1+readlnum] +
              numbers[2+readlnum] + numbers[3+readlnum] +
              numbers[4+readlnum];
Это что вообще?
Где объявление и инициализация readlnum?
Что за китайский код вообще? Циклы придумали трусы?
В чём вообще логика преобразования? То есть было "1, 23, 4, 5, 6" на выходе получим "123456", но и из "12, 3, 4, 5, 6" получим ровно тоже. Как на принимающей стороне мы поймём, что же передавалось?

Код:
Xотелось бы как-то преобразовать те 5 байт из строки, которые я выделяю в char и передать их по UDP уже в виде char-ов, а не в виде ASCII.
Что вы имеете в виду под char'ами? Массив символов char* string? Массив однобайтовых беззнаковых unsigned char array[5], т.е. числа от 0 до 255? Массив однобайтовых знаковых signed char array[5], т.е. в пределах от -128 до 127? Что-то ещё своё?


Название: Re: Как преобразовать из ASCII в char и отправить по UDP
Отправлено: ADA от Июль 18, 2011, 23:41
Код:
Естественно данные по UDP пересылаются в ASCII.
Что в этом естественного?
А то естественное, что изначально toPlainText() имеет тип данных QString то есть ASCII.
Код:
 lines = numbers[0+readlnum] + numbers[1+readlnum] +
              numbers[2+readlnum] + numbers[3+readlnum] +
              numbers[4+readlnum];
Это что вообще?
Где объявление и инициализация readlnum?
Что за китайский код вообще? Циклы придумали трусы?
Я вас не код мой критиковать просил, а реально помочь!

В чём вообще логика преобразования? То есть было "1, 23, 4, 5, 6" на выходе получим "123456", но и из "12, 3, 4, 5, 6" получим ровно тоже. Как на принимающей стороне мы поймём, что же передавалось?
Логика преобразования = Юзер вводит в EditText строки по пять байт, то есть ("01 02 03 0А СВ"). В EditText они воспринимаются как символы ASCII , а мне надо преобразовать их в HEX и передать по UDP.
Код:
Xотелось бы как-то преобразовать те 5 байт из строки, которые я выделяю в char и передать их по UDP уже в виде char-ов, а не в виде ASCII.
Что вы имеете в виду под char'ами? Массив символов char* string? Массив однобайтовых беззнаковых unsigned char array[5], т.е. числа от 0 до 255? Массив однобайтовых знаковых signed char array[5], т.е. в пределах от -128 до 127? Что-то ещё своё?
Именно это = unsigned char array[5]


Название: Re: Как преобразовать из ASCII в char и отправить по UDP
Отправлено: kambala от Июль 19, 2011, 00:46
Код
C++ (Qt)
QStringList numbers = sentText->toPlainText().split(QRegExp("[, \n\r]+"));
QByteArray datagramm;
foreach (QString number, numbers)
   datagramm += number.toUShort(0, 16); // тут еще можно проверочку на успешное преобразование строки в число


Название: Re: Как преобразовать из ASCII в char и отправить по UDP
Отправлено: ADA от Июль 19, 2011, 01:05
Код
C++ (Qt)
QStringList numbers = sentText->toPlainText().split(QRegExp("[, \n\r]+"));
QByteArray datagramm;
foreach (QString number, numbers)
   datagramm += number.toUShort(0, 16); // тут еще можно проверочку на успешное преобразование строки в число
УРА..!! Спасибо...то что надо....я спасён!!! :-*


Название: Re: Как преобразовать из ASCII в char и отправить по UDP
Отправлено: LisandreL от Июль 19, 2011, 08:40
А то естественное, что изначально toPlainText() имеет тип данных QString то есть ASCII.
QString во внутреннем представлении кодируется не в ASCII, а в UTF-16 - это так, для общего развития.

Я вас не код мой критиковать просил, а реально помочь!
Так чтобы помочь надо сначало понять, что же вам нужно.

Код
C++ (Qt)
QStringList numbers = sentText->toPlainText().split(QRegExp("[, \n\r]+"));
QByteArray datagramm;
foreach (QString number, numbers)
   datagramm += number.toUShort(0, 16); // тут еще можно проверочку на успешное преобразование строки в число
Да, всё правильно.
Ну, разве что действительно прикрутить проверку на правильность входных данных:
Код
C++ (Qt)
QStringList numbers = sentText->toPlainText().split(QRegExp("[, \n\r]+"));
QByteArray datagramm;
const int estimatedLength = 5;
bool ok;
quint8 num;
foreach (QString number, numbers)
{
   num = number.toUShort(&ok, 16);
   if (ok)
   {
       datagramm += num;
   }
   else
   {
       //! Ругаемся если не число - в данном случае в консоль приложения, по желанию можно показывать QMessageBox::warning
       qWarning( ( number + " is not a valid number" ).toAscii().data() );
   }
   //! Проверяем длину датаграммы
   if ( datagramm.size() < estimatedLength )
   {
       qWarning( "Too short datagramm" );
   }
   //! Добиваем нулями, если байтов не хватает
   while ( datagramm.size() < estimatedLength )
   {
        datagramm.append( '\0' );
   }
   if ( datagramm.size() > estimatedLength )
   {
       qWarning( "Too long datagramm" );
       datagramm.resize( estimatedLength );
   }
}