Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Склейка шестнадцатиричных чисел, чтение с COMпорта, Формат ответа и объединение чисел в одно 
:(
    Опции темы
mdlv
  Дата 1.2.2013, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.5.2012

Репутация: нет
Всего: нет



Здравствуйте!
Нужно читать шестнадцатиричные числа с com порта:
Код

....
unsigned char res[4096];
ReadFile(Cport[comport_number], res, size, (LPDWORD)((void *)&n), NULL);
...
for(i=0; i < n; i++){
 .... res[i] ....
}

1) Как будет выглядеть каждый элемент полученного массива res: "FF", "F" или 0xFF?

2)Нужно склеить их в одно шестнадцатиричное число вида:
0xFF008F750592,
причем числа, у которых впереди ноль (00, 05 и т.п.), нужно записывать с этим нулем.
Как это можно сделать на Си (не плюсах)?

Спасибо!
PM   Вверх
feodorv
Дата 1.2.2013, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
Как будет выглядеть каждый элемент полученного массива res: "FF", "F" или 0xFF?

Каждый элемент массива будет представлять собой число в диапазоне 0-255, а уж как Вы его представите, в виде ли "FF" или 0xFF - это уже от Вас зависит)))

Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
Нужно склеить их в одно шестнадцатиричное число вида

Вам 64-битное число или его строковое представление?


Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
(LPDWORD)((void *)&n)

Что это??? Какого типа у Вас переменная n?

Это сообщение отредактировал(а) feodorv - 1.2.2013, 12:59


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
mdlv
Дата 1.2.2013, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 14.5.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  1.2.2013,  12:58 Найти цитируемый пост)
Вам 64-битное число или его строковое представление?

Надо число.

Цитата(feodorv @  1.2.2013,  12:58 Найти цитируемый пост)

(LPDWORD)((void *)&n)

Что это??? Какого типа у Вас переменная n?


Переменная типа int. 

Формат функции ReadFile:
BOOL ReadFile(
  HANDLE       hFile, // описатель CОМ порта
  LPVOID       lpBuffer, // Указатель на буфер, который принимает прочитанные данные из порта
  DWORD        nNumberOfBytesToRead,// Число байтов, которые читаются из порта
  LPDWORD      lpNumberOfBytesRead, // Указатель на переменную, которая получает число прочитанных байтов
  LPOVERLAPPED lpOverlapped    // Указатель на структуру OVERLAPPED.
);
PM   Вверх
feodorv
Дата 1.2.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(mdlv @  1.2.2013,  14:48 Найти цитируемый пост)
Надо число.

Код

unsigned __int64 num = 0;
...
// Вариант1
if( n >= 8 )
  num = *(unsigned __int64 *) res;

// Вариант 2.1
if( n >= 8 )
  num = ((unsigned __int64) res[0] << 56) | ((unsigned __int64) res[1] << 48) |
        ((unsigned __int64) res[2] << 40) | ((unsigned __int64) res[3] << 32) |
        ((unsigned __int64) res[4] << 24) | ((unsigned __int64) res[5] << 16) |
        ((unsigned __int64) res[6] << 8) | ((unsigned __int64) res[7]);

// Вариант 2.2
if( n >= 8 )
  for( num = 0, i =0; i <8; i++) num = (num << 8) | (unsigned __int64) res[i];

// Вариант 3.1
if( n >= 8 )
  num = ((unsigned __int64) res[7] << 56) | ((unsigned __int64) res[6] << 48) |
        ((unsigned __int64) res[5] << 40) | ((unsigned __int64) res[4] << 32) |
        ((unsigned __int64) res[3] << 24) | ((unsigned __int64) res[2] << 16) |
        ((unsigned __int64) res[1] << 8) | ((unsigned __int64) res[0]);

// Вариант 3.2
if( n >= 8 )
  for( num = 0, i =0; i <8; i++) num = (num << 8) | (unsigned __int64) res[8-i-1];

в зависимости от порядка посылаемых байт...


Цитата(mdlv @  1.2.2013,  14:48 Найти цитируемый пост)
Формат функции ReadFile:
BOOL ReadFile(
  HANDLE       hFile, // описатель CОМ порта
  LPVOID       lpBuffer, // Указатель на буфер, который принимает прочитанные данные из порта
  DWORD        nNumberOfBytesToRead,// Число байтов, которые читаются из порта
  LPDWORD      lpNumberOfBytesRead, // Указатель на переменную, которая получает число прочитанных байтов
  LPOVERLAPPED lpOverlapped    // Указатель на структуру OVERLAPPED.
); 

И что? Это как-то оправдывает такое:
Цитата(mdlv @  1.2.2013,  11:35 Найти цитируемый пост)
(LPDWORD)((void *)&n)


Писали бы сразу 
Код
DWORD i, n;

На худой конец 
Код
unsigned int i, n;

А то эти преобразования типа указателя до добра не доведут...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.