Форум программистов, компьютерный форум CyberForum.ru

Нужно чтобы на экран числа выводились в 16-ричном формате - C++

Восстановить пароль Регистрация
 
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 11:24     Нужно чтобы на экран числа выводились в 16-ричном формате #1
В кратце: пишу CAN-месенджер в принципе он работает, но есть одно НО. Мне нужно чтобы на экран числа выводились в 16-ричном формате. Ниже привожу код преобразования:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void can_protocol::ShowOneCanFrame(Can_frame message, int position)
{
    if(ptrII == NULL) return;
    TCHAR buf[50];
    
    _swprintf(buf, _T("%u"), position+1);
    ptrII->message_list.SetItemText(position, 0, buf);
 
    _swprintf(buf, _T("%u:%02u:%02u:%03u"), message.time.wHour, message.time.wMinute, message.time.wSecond, message.time.wMilliseconds);
    ptrII->message_list.SetItemText(position, 3, buf);
    
    _swprintf(buf, _T("%08X"), message.mess.id);
    ptrII->message_list.SetItemText(position, 2, buf);
 
    _swprintf(buf, _T("%u"), message.mess.length);
    ptrII->message_list.SetItemText(position, 4, buf);
 
    std::tcstring str = _T("");
    for(int i = 0; i < 8; i++)
    {
        TCHAR Buf[3];
        _swprintf(Buf, _T("%02X "), message.mess.data[i]);
        str+=Buf;
    }
    ptrII->message_list.SetItemText(position, 6, str.c_str());
 
    ptrII->message_list.SetItemText(position, 1, message.type == RECIEVED_FRAME? _T("RX"):_T("TX"));
    ptrII->message_list.SetItemText(position, 5, _T("EFF"));
}
И скрин:
Нужно чтобы на экран числа выводились в 16-ричном формате

Как это исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2014, 11:24     Нужно чтобы на экран числа выводились в 16-ричном формате
Посмотрите здесь:

Как зделать чтобы при открытии программы выводились разные числа C++
C++ Нужно, чтобы показало все трехзначные числа, а то показывает 10
C++ Работа со строками ( сделать так, чтобы введенные символы с пробелом выводились в виде идентификаторов)
C++ сделать так, чтобы при разных значениях cin, выводились разные сообщения
Работа с сокетами Беркли: Нужно, чтобы сервер выдавал степень числа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 12:31     Нужно чтобы на экран числа выводились в 16-ричном формате #2
Две шестнадцатиричные цифры, плюс пробел, плюс завершающий ноль - нужен массив как минимум из четырёх элементов.
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 12:33  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #3
у меня байтовый массив для 8 элементов. разве в один байт нельзя уместить число FF?
Я что то плохо понял, что вы мне сказать хотели
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 12:37     Нужно чтобы на экран числа выводились в 16-ричном формате #4
21-я строка. В виде текста туда поместиться только 2 символа + ноль в конце. Для пробела места нет.
И ещё я не понял, о какой проблеме идёт речь?
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 12:40  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #5
Проблема такова, что я хочу видеть в поле сообщений числа 0123456789ABCDEF, а в место этого вижу 0123456789 10 11 12 и т.д.

Добавлено через 50 секунд
А по поводу пробела: на скрине в поле "посылка" пробел пробел присутсвует
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 12:45     Нужно чтобы на экран числа выводились в 16-ричном формате #6
А я не вижу чисел 10, 11 и 12. Подставь вместо message.mess.data[i] число 10. Что получится?
По поводу размера массива я тебя предупредил. Это будет работать до поры до времени.
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 12:55  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #7
Нужно чтобы на экран числа выводились в 16-ричном формате
На своем компе я замкнул два CAN-порта, и общаюсь между ними. Одним приложением отправляю сообщение, другим принимаю. По поводу того что вы не видите чисел, так вот отправляется то, что внизу я укажу.
Размер буфера поправил...
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 12:58     Нужно чтобы на экран числа выводились в 16-ричном формате #8
Хорошо. Структура Can_frame как выглядит? Как заполняется массив data?
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 13:00  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #9
Подставил вместо message.mess.data[i], увидел число 0А. Теперь можете мне объяснить, почему когда я беру число и эдита, оно остается таким же, а когда я его в коде явно указываю, то оно конвертируется в 16ричное?

Добавлено через 1 минуту
Структура Can_frame:
C++
1
2
3
4
5
6
7
8
9
10
struct Can_frame
{
    canmsg_t mess;
    SYSTEMTIME time; 
    TYPE_CAN_FRAME type;
    
    Z::Result recieve_from(Z::Stream& input); 
    Z::Result send_to(Z::Stream& output) const;
    void ShowSelf();
};
Здесь я собираю всю информацию, введенную в контролах:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
void can_protocol::GetCtrlData()
{
    if(ptrII == NULL) return;
    if(ctrl_access == false) return;
    TCHAR str1[9];
    BYTE tempdatamsg[8];
    
    ptrII->data1.GetWindowTextW(str1, 8);
    int msg1;
    Radix radix(_T("0123456789ABCDEF"));
    radix.add_equiv_seq(_T("0123456789abcdef"));
    msg1 = str2uint(str1, radix);
    tempdatamsg[0] = msg1;
 
    ptrII->data2.GetWindowTextW(str1, 8);
    int msg2;
    msg2 = str2uint(str1, radix);
    tempdatamsg[1] = msg2;
 
    ptrII->data3.GetWindowTextW(str1, 8);
    int msg3;
    msg3 = str2uint(str1, radix);
    tempdatamsg[2] = msg3;
 
    ptrII->data4.GetWindowTextW(str1, 8);
    int msg4;
    msg4 = str2uint(str1, radix);
    tempdatamsg[3] = msg4;
 
    ptrII->data5.GetWindowTextW(str1, 8);
    int msg5;
    msg5 = str2uint(str1, radix);
    tempdatamsg[4] = msg5;
 
    ptrII->data6.GetWindowTextW(str1, 8);
    int msg6;
    msg6 = str2uint(str1, radix);
    tempdatamsg[5] = msg6;
 
    ptrII->data7.GetWindowTextW(str1, 8);
    int msg7;
    msg7 = str2uint(str1, radix);
    tempdatamsg[6] = msg7;
 
    ptrII->data8.GetWindowTextW(str1, 8);
    int msg8;
    msg8 = str2uint(str1, radix);
    tempdatamsg[7] = msg8;
 
    ptrII->id_can_mess.GetWindowTextW(str1, 8);
    int ID;
    ID = str2uint(str1, radix);
 
    ptrII->length_can_mess.GetWindowTextW(str1, 8);
    int LENGTH;
    LENGTH = _wtoi(str1);
    
    if(LENGTH > 8) 
    {
        LENGTH = 8;
        ptrII->length_can_mess.SetWindowTextW(_T("8"));
    }
 
    CString str("SFF");
    ptrII->flag_can_mess.GetWindowTextW(str1, 5);
    int SendFlag = 0;
    CString STR1(str1);
    if (str == STR1)
    {
        SendFlag = 0;
    }
    else
    {
        SendFlag = 1<<2;
    }
    
    for(int i = 0; i < LENGTH; i++)
    {
        tx_msg_frame.mess.data[i] = tempdatamsg[i];
    }
 
    ptrII->time_cycle.GetWindowTextW(str1, 8);
    cycle_delay = _wtoi(str1);
 
    tx_msg_frame.mess.flags = SendFlag;
    tx_msg_frame.mess.id = ID;
    tx_msg_frame.mess.length = LENGTH;
 
}
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 13:02     Нужно чтобы на экран числа выводились в 16-ричном формате #10
canmsg_t можно увидеть?
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 13:04  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #11
C++
1
2
3
4
5
6
7
typedef struct {
        int                     flags;                  /* Flags, indicating or controlling special message properties */
        int                     cob;                    /* CAN object number, used in Full CAN */
        ULONG                   id;                     /* CAN message ID, 4 bytes  */
        short int               length;                 /* Number of bytes in the CAN message */
        UCHAR                   data[DATALENGTH];       /* Data, 0...8 bytes */
} canmsg_t;
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 13:04     Нужно чтобы на экран числа выводились в 16-ричном формате #12
Всё понятно. Из полей ты их считываешь как 16-ныне числа, как и выводишь.
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 13:06  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #13
Что то до меня все еще не дошло...
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 13:10     Нужно чтобы на экран числа выводились в 16-ричном формате #14
Я не знаю что у тебя за компилятор и что такое Radix, но могу предположить что должно быть так:
C++
1
Radix radix( _T( "0123456789 ));
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 13:30  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #15
Компилятор VS05, класс Radix достался мне от моего наставника, она конвертирует строку в тот формат который я укажу. Те исправления, которые вы внесли юудут конвертировать в 10-ричный формат. Если убрать "9" и "8", получится 8-ричный формат
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 13:36     Нужно чтобы на экран числа выводились в 16-ричном формате #16
Если это вопрос, то да.
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 13:42  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #17
Нет, это утверждение. Вопрос в моем последнем посте не было.
Остается открытым вопрос, почему при явном указании в коде числа 10 я вижу в списке 0А, а при взятии этой же десятки из эдита она в списке остается десяткой

Добавлено через 4 минуты
Цитата Сообщение от castaway Посмотреть сообщение
могу предположить что должно быть так:
попробовал - не помогло
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 13:43     Нужно чтобы на экран числа выводились в 16-ричном формате #18
Потому что это не десятка, а 0x10, т.е. 16. Ты их вводишь как шеснадцатиричные, вне десятичные, что тут трудно понять?

Добавлено через 55 секунд
Покажи как пробовал.
takhvatulin
10 / 10 / 0
Регистрация: 04.04.2014
Сообщений: 135
21.08.2014, 13:48  [ТС]     Нужно чтобы на экран числа выводились в 16-ричном формате #19
Т.е когда я ввожу в эдит "10" на самом деле я ввожу 0х10?
Мдаа, что сегодня мозг со мной не дружит...
У меня так: если я в эдит введу "А", в списке я увижу "0А". Т.е. мой эдит воспринимает 16ричные числа. Соответсвенно когда я ввожу "10" он в 10тичном формате воспримит ее как 16, но так как я прошу его выводить мне в 16ричной, то он и выводит ту же десятку, верно?

Добавлено через 2 минуты
Все, я разобрался. Спасибо castaway!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2014, 13:49     Нужно чтобы на экран числа выводились в 16-ричном формате
Еще ссылки по теме:

C++ Как сделать чтобы в постфиксной записи кроме цифр выводились еще и обычные символы
Представление числа в 16-ричном виде C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
21.08.2014, 13:49     Нужно чтобы на экран числа выводились в 16-ричном формате #20
Да.
Yandex
Объявления
21.08.2014, 13:49     Нужно чтобы на экран числа выводились в 16-ричном формате
Ответ Создать тему
Опции темы

Текущее время: 06:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru