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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как запаковать в пакет (комбинированный байт) ??? как запаковать в пакет??? 
:(
    Опции темы
princessik
  Дата 13.6.2015, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, неожиданно возникла потребность упаковать в передаваемый пакет два числа по этой схеме:
user posted image
в совмещенном бите находятся самые младшие разряды обоих чисел, т.е если есть  числа
1111 1111 1111 0000 и 0000 0000 0000 1111 то в совмещенном бите будут
раздяды 0000 первого числа и разряды 1111 второго числа

подскажите пожалуйста в чем ошибка??
Код

            packet[0] = Byte(m_sendData.latitude >> 8 & 0xFF);
            packet[1] = Byte(m_sendData.latitude >> 16 & 0xFF);
            packet[2] = Byte(m_sendData.latitude >> 24 & 0xFF);
            packet[3] = Byte((m_sendData.latitude << 5 & 0xFF) | (1 << 4) | (m_sendData.longitude & 0x0F));
            packet[4] = Byte(m_sendData.longitude >> 4 & 0xFF);
            packet[5] = Byte(m_sendData.longitude >> 8 & 0xFF);
            packet[6] = Byte(m_sendData.longitude >> 16 & 0xFF);


долгота вроде правильно присылается, а вот с широтой что-то не то...

Это сообщение отредактировал(а) princessik - 13.6.2015, 14:47
PM MAIL   Вверх
feodorv
Дата 14.6.2015, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(princessik @  13.6.2015,  14:40 Найти цитируемый пост)
            packet[5] = Byte(m_sendData.longitude >> 12 & 0xFF);
            packet[6] = Byte(m_sendData.longitude >> 20 & 0xFF);



Цитата(princessik @  13.6.2015,  14:40 Найти цитируемый пост)
долгота вроде правильно присылается

Есть сомнение:
Цитата(princessik @  13.6.2015,  14:40 Найти цитируемый пост)
m_sendData.latitude << 5

В результате бит номер три (если отсчитывать от нуля) тихо исчезает со сцены...


Не понятна роль единицы.


Цитата(princessik @  13.6.2015,  14:40 Найти цитируемый пост)
в совмещенном бите

В совмещённом байте?


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


Новичок



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

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



да, байте, опечатка
насчет единицы не знаю её роль, но а так не было студии под рукой чтобы проверить свой код, спасибо большое

Это сообщение отредактировал(а) princessik - 14.6.2015, 09:35
PM MAIL   Вверх
princessik
Дата 16.6.2015, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



       получается,  теперь правильно?
Код

            packet[0] = Byte(m_sendData.latitude >> 5 & 0xFF);
            packet[1] = Byte(m_sendData.latitude >> 13 & 0xFF);
            packet[2] = Byte(m_sendData.latitude >> 21 & 0xFF);
            packet[3] = Byte((m_sendData.latitude << 5 & 0xFF) | (1 << 4) | (m_sendData.longitude & 0x0F));
            packet[4] = Byte(m_sendData.longitude >> 4 & 0xFF);
            packet[5] = Byte(m_sendData.longitude >> 12 & 0xFF);
            packet[6] = Byte(m_sendData.longitude >> 20 & 0xFF);


Это сообщение отредактировал(а) princessik - 16.6.2015, 10:38
PM MAIL   Вверх
baldina
Дата 16.6.2015, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



princessik, здесь проще использовать битовые поля

Код

typedef unsigned char byte;

#pragma pack(push, 1)
union {
    byte packet[7];
    struct {
       unsigned latitude: 27;
       unsigned one: 1;
       unsigned longitude: 28;
    } data;
} u;
#pragma pack(pop)
...
u.data.latitude = m_sendData.latitude;
u.data.one = 1;
u.data.longitude = m_sendData.longitude;
...
send(u.packet);


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



baldina, вот только что делать в случает машин с другим порядком байт в словах?
PM   Вверх
princessik
Дата 16.6.2015, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, но..каким образом data соответствует packet, это же получаются два разных поля? я как-то упаковывала в юнионы, там действительно есть свои подводные камни,
а со сдвигами всё-таки что не так?

Это сообщение отредактировал(а) princessik - 16.6.2015, 12:57
PM MAIL   Вверх
feodorv
Дата 16.6.2015, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(princessik @  16.6.2015,  12:53 Найти цитируемый пост)
а со сдвигами всё-таки что не так?

У Вас три бита откусываются на совмещённый байт. А здесь
Цитата(princessik @  16.6.2015,  10:36 Найти цитируемый пост)
            packet[0] = Byte(m_sendData.latitude >> 5 & 0xFF);
почему-то считается, что их пять...



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


Эксперт
****


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

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



bsa, можно так, например
в случае с явными битовыми операциями это ведь тоже учесть придется. а искать блох в семи копипастах дело имхо неблагодарное. поэтому отвечать на вопрос
Цитата(princessik @  16.6.2015,  12:53 Найти цитируемый пост)
а со сдвигами всё-таки что не так?

мне элементарно лень

Цитата(princessik @  16.6.2015,  12:53 Найти цитируемый пост)
каким образом data соответствует packet

это union, так что data и packet занимают одну область памяти. получаются два разных представления одних и тех же данных, что вам и нужно.
PM MAIL   Вверх
princessik
Дата 16.6.2015, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



       то ли я чего то не понимаю, вообщем порядок должен быть таков что в 4м байте идут самые старшие биты, потом средние в 0м, 1м и самые младшие биты в 2м и со второй переменной точно так же
поэтому можно ли union из примера использовать??




Это сообщение отредактировал(а) princessik - 16.6.2015, 16:39
PM MAIL   Вверх
baldina
Дата 16.6.2015, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



big-endian? логично)))
union, и вообще любая структура, используют текущий для данной платформы порядок байт. поэтому, например, среднее слово (куда попадает единица между координатами) будет "перевернуто" даже при использовании битовых полей на платформе x86 (little endian).
для преобразования в порядок big-endian (от старшего к младшему), который обычно используется для сетевой передачи, на любой платформе есть функции htonl, htons и тп. или см. мою ссылку выше.

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

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

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

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

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


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

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


 




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


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

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