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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор WORD/DWORD, как?.. 
:(
    Опции темы
NPLana
Дата 8.4.2009, 13:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день! Думаю разделом не ошибусь, если напишу сюда)
Просто никогда с этим не приходилось сталкиваться ранее. А поиск не очень помог.

Суть такова.  Получаем неким образом сообщение вида

Код

7     0 15    8 
|------|-------|
|  a   |   b   |
|------|-------|
где
a - знаковое целое число
b - беззнаковое целое число

Как разобрать полученные данные?..
PM MAIL   Вверх
InvalidProperty
Дата 8.4.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

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



Код

DWORD c;
WORD a, b, *p;

p = (WORD *)&c;
a = *p;
p++;
b = *p;


что-то вроде этого


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
zim22
Дата 8.4.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(NPLana @  8.4.2009,  13:10 Найти цитируемый пост)
Как разобрать полученные данные?..

как вы их хотите разобрать?


--------------------
PM MAIL   Вверх
Dem_max
Дата 8.4.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Код

WORD W = 0x1F;
BYTE LB = LOBYTE(W);
BYTE HB = HIBYTE(W);
signed int i = (signed int)LB;
unsigned int j = (unsigned int)HB;


Это сообщение отредактировал(а) Dem_max - 8.4.2009, 13:31


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
NPLana
Дата 8.4.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если конкретней - суть такова.
Неким образом (предположительно UDP) получаем сообщение вида: 
Код

| a | b | с |
a - байт с id отправителя
b - байт с типом сообщения
с - само сообщение, напр представляющее собой запись длиной 48 бит (8 байт) 
7     0 15    8 23   16 31    24  7     0 15    8  7     0 15    8 
|------|-------|------|-------|  |------|-------|  |------|-------|
|  a   |   b   |  c   |   d   |  |   e  |   f   |  |  g   |   h   |
|------|-------|------|-------|  |------|-------|  |------|-------|

где а,b,c - образуют время в мс (мах 8640000)
e,g - знаковое целое число
f,h - беззнаковое целое число
e,f образуют значение широты, g,h - долготы

Поскольку более привычно читать данные из простого текстового файла, то возникла проблема, как бы привести полученные данные в человечесвкий вид и далее их отобразить)
PM MAIL   Вверх
GoldFinch
Дата 8.4.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



int x;
a=x>>16;  //или a=(x>>16) &0xFF;
b=x & 0xFFFF;
PM MAIL ICQ   Вверх
mes
Дата 8.4.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата

само сообщение, напр представляющее собой запись длиной 48 бит (8 байт )
...
где а,b,c - образуют время в мс (мах 8640000)

вот так можно :
Код

unsigned char msg[8]; //   8*8 = 64 ! , a не 48 :)
long msg_getTime (unsigned char* msg )
{
     return ( msg[0]<<8*2) | (msg[1]<<8) | msg[2];
}


Это сообщение отредактировал(а) mes - 8.4.2009, 14:03


--------------------
PM MAIL WWW   Вверх
zim22
Дата 8.4.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



GoldFinch, я бы так написал:
Код
  unsigned short x = 65535;
  int a = x & 0xFF;  
  unsigned int b = x & 0xFF00;




--------------------
PM MAIL   Вверх
mes
Дата 8.4.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zim22 @  8.4.2009,  12:57 Найти цитируемый пост)
unsigned int b = x & 0xFF00;

тут ничего не забыто ?!  smile 


--------------------
PM MAIL WWW   Вверх
zim22
Дата 8.4.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(mes @  8.4.2009,  14:05 Найти цитируемый пост)
тут ничего не забыто ?!  

включаю мозг:

x занимает 16 бит. т.к. тип short.
65535(dec) = 1111111111111111(bin)

наложив на него битовую маску 0xFF00 мы добьёмся вот этого:
1111111100000000

дальше, тип short преобразуется к типу int, т.е. нули справа допишет
00000000000000001111111100000000

так это или не так - легко проверить:
Код
unsigned int b = x & 0xFF00;
  std::bitset<32> bs(b); // совпало!

так что я не знаю, что тут могло быть забыто... smile




--------------------
PM MAIL   Вверх
mes
Дата 8.4.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zim22 @  8.4.2009,  14:34 Найти цитируемый пост)
так что я не знаю, что тут могло быть забыто... smile

Цитата(zim22 @  8.4.2009,  12:57 Найти цитируемый пост)
 unsigned int b = x & 0xFF00;

как понял здесь Вы получали 
Цитата(NPLana @  8.4.2009,  12:35 Найти цитируемый пост)
b - байт с типом сообщения

то в таком случае необходимо сдвинуть smile




--------------------
PM MAIL WWW   Вверх
zim22
Дата 8.4.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



mes, я решал задачу из самого первого сообщения. всё-равно не правильно?
Цитата(NPLana @  8.4.2009,  13:10 Найти цитируемый пост)
a - знаковое целое числоb - беззнаковое целое число

******
всё,  я понял. действительно необходимо было сдвинуть smile

Это сообщение отредактировал(а) zim22 - 8.4.2009, 16:15


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

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

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

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

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


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

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


 




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


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

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