Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
161 / 45 / 10
Регистрация: 25.08.2014
Сообщений: 345
1

Перевести Int в unsigned char в формате hex

05.10.2015, 12:07. Показов 5643. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую всех.
Что-то тупняки с утра дикие, помогите пожалуйста сообразить как правильно сделать:
Есть у меня пакет с данными который должен уйти, но перед этим надо сформировать хвост, который делается в ручную в зависимости от того что выберет человек(5 значений). Последовательность чисел, что выбирает человек в 10м формате. Цифры от 0 до 25. Я их принимаю и надо записать в хвост пакета для отправки в 16м виде.
т.е. есть начало
DA 01 FF FF 55 17
Человек водит
9-13-21-0-5
Мне надо эту последовательность преобразовать и добавить к пакету.
9-D-15-0-5
Проблема с преобразованием

C++ (Qt)
1
2
3
4
5
6
7
8
9
unsigned char array[11]; //мой массив который содержит начало пакета
...
for(int j = 0; j < 26; j++) //бежим по всем числам и проверяем что выбрано
{
  if(/*нужная проверка*/) //если j наше число его надо записать в хвост массива
  {
     array[N] = QString::number(j,16).toInt();
  }
}
При таком занесении работает числа 0-9, 16-25
Числа которые имеют буквенное обозначение заносятся как 0

пробовал через Qstring.
C++ (Qt)
1
str = QString("%1").arg(j,0,16).toUpper();
Но при таком раскладе я не знаю как преобразовать нормально строку в unsigned char, тк формат
C++ (Qt)
1
toStdString().c_str()
сюда не подходит, тк требуется const char*

Заранее спасибо за ответы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2015, 12:07
Ответы с готовыми решениями:

Ошибка конвертирования from 'quint32 (*)() {aka unsigned int (*)()}' to 'quint32 {aka unsigned int}'
Программа создаёт TCP сервер и использует внутренний ip адрес, вот код: quint32 LocalIp() {...

Char и const unsigned char
Есть сторонняя библиотека с функцией которая как параметр принимает const unsigned char *DPTRS...

QString перевести в char* || QChar перевести в char*
Подскажите пожалуйста как сделать: Исходники в utf-8, qt4.8 setlocale(LC_ALL, &quot;Russian&quot;); ...

qstring to unsigned char*
как же много еще я не знаю... сохраняю значение unsigned char* ucTTT; ucTTT = new unsigned...

8
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
05.10.2015, 13:03 2
Что-то ты по-моему не то творишь.
Цитата Сообщение от Sph Посмотреть сообщение
пробовал через Qstring.
C++ (Qt)
1
str = QString("%1").arg(j,0,16).toUpper();
Но при таком раскладе я не знаю как преобразовать нормально строку в unsigned char, тк формат
C++ (Qt)
1
str = QString::number(j,16).toUpper();
QString в обычную строку можно с помощью QString::toLocal8bit().data() преобразовать. signed char, unsigned char, какая разница? они всё равно за границы не должны вылезать, так что делай обычный cast.
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
05.10.2015, 13:10 3
Sph,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    // числа полученные от пользователя
    QString numsFromUser("9-D-15-0-5");
 
    // добавляем начало пакета
    QByteArray outArray;
    unsigned char sPackBegin[] = { 0xDA, 0x01, 0xFF, 0xFF, 0x55, 0x17 };
    outArray.append((char*)sPackBegin, sizeof(sPackBegin));
 
    // обрабатываем каждое число полученное от пользователя
    foreach (const QString & num, numsFromUser.split('-')) {
        bool ok = false;
        int numInInt = num.toInt(&ok, 16);          // конвертируем из строкового представления
        Q_ASSERT(ok);                               // ковертация прошла удачно
        Q_ASSERT(numInInt >= 0 && numInInt <= 255); // итоговое число поместится в unsigned char
        outArray.append((char*)&numInInt, 1);       // добавляем число в итоговый массив
    }
 
    // итоговый пакет в строковом представлении
    // чтобы получить указатель на данные в char* нужно вызвать outArray.data()
    qDebug() << outArray.toHex();
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
05.10.2015, 13:52 4
Цитата Сообщение от Sph Посмотреть сообщение
Цифры от 0 до 25. Я их принимаю и надо записать в хвост пакета для отправки в 16м виде.
Присмотрелся получше. Что-то я не понимаю, при чём тут 16ричный символьный вид, если идёт обычная отправка байтов? Или же ты отправляешь символы, но тогда почему массив char у тебя всего 11 размером?
Если же тебе надо просто байты отправить и пользователь вводит последние 5 байт в 10тичной системе, то зачем вся эта возня с 16ричной системой?
Моя твоя не понимать!
Добавлено через 11 минут
Цитата Сообщение от schdub Посмотреть сообщение
int numInInt = num.toInt(&ok, 16);
Может быть ты и понял его единственно верно. Но тогда всё же база должна быть 10, раз у него пользователь вводит в десятичной системе
Цитата Сообщение от schdub Посмотреть сообщение
outArray.append((char*)&numInInt, 1);
А так точно можно делать? Может лучше сделать outArray.append((char)numInInt)?
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
05.10.2015, 15:48 5
Тупняки действительно страшные. Это тебе надо?

C++ (Qt)
1
2
3
4
5
6
7
unsigned char array[11] = {0xDA,  0x01, 0xFF, 0xFF, 0x55, 0x17, 0, 0, 0, 0, 0};
 
array[6] = 9;
array[7] = 13;
array[8] = 21;
array[9] = 0;
array[10] = 5;
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
05.10.2015, 21:02 6
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
А так точно можно делать? Может лучше сделать outArray.append((char)numInInt)?
Shtirliz72, согласен с Вами. Забыл про эту функцию.
0
161 / 45 / 10
Регистрация: 25.08.2014
Сообщений: 345
06.10.2015, 09:37  [ТС] 7
да тупняки жестокие.
Кароче, есть некая последовательность значений в 10м формате.
А в пакет их нужно запихать как 16й значения, иначе девайсина не поймет посылку.
т.е. если человек, выбрал значение "10" то должно уйти значение "А", тк распознает девайс все байты как 16значения, и в итоге "10" если отправим как есть то будет распознано как будто мы подали значение "16".

Добавлено через 3 минуты
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
QString в обычную строку можно с помощью QString::toLocal8bit().data()
Строка это как вариант был для преобразований, а дальше случился еще больше ступор.
А как строку в чар то вернуть. Манипуляции выше в первом посте с результатами.

schdub
спасибо за вариант попробую

alexu_007
не совсем.
значения то в 10м формате,
C++ (Qt)
1
2
3
4
5
array[6] = 9;
array[7] = 13;
array[8] = 21;
array[9] = 0;
array[10] = 5;
а надо чтобы они стали вот такими:
C++ (Qt)
1
2
3
4
5
array[6] = 9;
array[7] = D;
array[8] = 15;
array[9] = 0;
array[10] = 5;
Добавлено через 4 минуты
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Что-то я не понимаю, при чём тут 16ричный символьный вид, если идёт обычная отправка байтов? Или же ты отправляешь символы, но тогда почему массив char у тебя всего 11 размером?
Если же тебе надо просто байты отправить и пользователь вводит последние 5 байт в 10тичной системе, то зачем вся эта возня с 16ричной системой?
Моя твоя не понимать!
Да, обычная отправка байтов.
Массив char ну потому что удобно. 11 потому что пакет такой длины
а преобразование из 10 в 16 потому что девайсина молчит и не понимает что ей послали.
т.е. если ручками вбить например в хвост пакета А-B-C-D-E
то все ок, а если ввести вручную 10-11-12-13-14 то тишина
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
06.10.2015, 10:48 8
Лучший ответ Сообщение было отмечено Sph как решение

Решение

Цитата Сообщение от Sph Посмотреть сообщение
Массив char ну потому что удобно. 11 потому что пакет такой длины
а преобразование из 10 в 16 потому что девайсина молчит и не понимает что ей послали.
т.е. если ручками вбить например в хвост пакета А-B-C-D-E
то все ок, а если ввести вручную 10-11-12-13-14 то тишина
Не, я не немного не про то.
Есть два варианта передачи чисел - собственно raw-данными и текстом. 16-ричный, 2-ичный и прочие форматы - это просто удобночитаемые человеком _текстовые_ виды отображения на экране raw-данных.
Если у вас человек вводит данные в десятичном _текстовом_ формате и вам их надо передать дальше в raw-формате, то нет никакой нужны использовать промежуточные 16ричные _текстовые_ значения. Просто используете вышеприведённое(я чуть его изменил):
Цитата Сообщение от schdub Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// числа полученные от пользователя
    QString numsFromUser("9-D-15-0-5");
    // обрабатываем каждое число полученное от пользователя
    QByteArray outArray; //пакет
 
    foreach (const QString & num, numsFromUser.split('-')) {
        bool ok = false;
        int numInInt = num.toInt(&ok, 10);          // конвертируем из строкового представления
        Q_ASSERT(ok);                               // ковертация прошла удачно
        Q_ASSERT(numInInt >= 0 && numInInt <= 255); // итоговое число поместится в unsigned char
        outArray.append(reinterpret_cast<char>((unsigned char)numInInt));       // добавляем число в итоговый массив
    }
   
   // добавляем начало пакета
   unsigned char sPackBegin[] = { 0xDA, 0x01, 0xFF, 0xFF, 0x55, 0x17 };
   outArray.prepend((char*)sPackBegin, sizeof(sPackBegin));
   // чтобы получить указатель на данные в char* нужно вызвать outArray.data()
 
   // вывод размера массива
   qDebug() << OutArray.size();
   // вывод raw-значений массива в 16ричном _текстовом_ формате
   qDebug() << QString(OutArray.toHex());
1
161 / 45 / 10
Регистрация: 25.08.2014
Сообщений: 345
07.10.2015, 09:23  [ТС] 9
Shtirliz72 Спасибо,кажется работает как надо
Подстроил под свой код, вроде ошибок пока нет, буду тестировать.
0
07.10.2015, 09:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2015, 09:23
Помогаю со студенческими работами здесь

unsigned char через QSerialPort
Пишу программу для общения микроконтроллера с компом через COM-порт. Использую класс QSerialPort....

Из lineEdit в unsigned char и обратно
Здравствуйте. Наверняка этот вопрос уже много раз поднимался... да и в гугле много по этому поводу...

QDatastream запись unsigned char*
Как записать данные в буфере unsigned char*? Есть методы writeBytes и writeRawdata но они...

Перевод из Qstring в unsigned char
Сломал голову как сделать такое преобразование((( имеется Qstring str = &quot;0xFFFFFFE0&quot; как эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru