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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как преобразовать из ASCII в char и отправить по UDP  (Прочитано 6141 раз)
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.
Подскажите, как мне это сделать, пожалуйста.

ЗЫ: Всем отозвавшимся заранее спасибо  Подмигивающий
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июль 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? Что-то ещё своё?
Записан
ADA
Гость
« Ответ #2 : Июль 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]
« Последнее редактирование: Июль 18, 2011, 23:44 от ADA » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июль 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); // тут еще можно проверочку на успешное преобразование строки в число
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ADA
Гость
« Ответ #4 : Июль 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); // тут еще можно проверочку на успешное преобразование строки в число
УРА..!! Спасибо...то что надо....я спасён!!! Целующий
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июль 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 );
   }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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