Название: Как преобразовать из 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 ); } }
|