Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Протокол общения. Помогите с битами-байтами 
:(
    Опции темы
chiffa
Дата 27.4.2017, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем добрый день. Есть протокол общения с один девейсом через комп порт, с описании сказано, что в пакете пакет состоит из блоков, в блоках передаются байты. в описании одного из блоков:
Размер блока: 1байт
Состоит из: 
    - Номера канала 0-2 бит
    - пакет 3 бит
    - 4-5бит
    - тип 6-7 биты
и как пример приведено 80 - байт. Собственно вопрос, как этот байт разложить на биты, что понять структуру блока?

Заранее всем спасибо!

P.S. понимаю, что 80 в БИН это 10000000 и как бы оно соответствует, но в описании сказано, что в примере (байт 80), номер канала 0. то есть в моем понимании должно быть не 10, а 00...

Это сообщение отредактировал(а) chiffa - 27.4.2017, 15:43
PM MAIL   Вверх
azesmcar
Дата 27.4.2017, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(chiffa @  27.4.2017,  15:26 Найти цитируемый пост)
как этот байт разложить на биты

через битовые операции.

делаешь операцию AND (&) с нужно тебе маской и получаешь результат.

скажем тебе нужно два первых бита числа
Код

10110101 (181)

делаешь
Код

10110101 (181)
AND
11000000 (192)
-------------
10000000 (128)

на C++ будет выглядеть вот так.
Код

enum channel_no
{
    channel0 = 0,    // 00
    channel1 = 64,   // 01
    channel2 = 128,  // 10
    channel3 = 192,  // 11
    channel_mask = channel3
};

int main()
{
    unsigned char data = 181; // 11110101

    channel_no ch = static_cast<channel_no>(data & channel_no::channel_mask);

    switch (ch)
    {
    case channel0:
        std::cout << "channel 0" << std::endl;
        break;
    case channel1:
        std::cout << "channel 1" << std::endl;
        break;
    case channel2:
        std::cout << "channel 2" << std::endl;
        break;
    case channel3:
        std::cout << "channel 3" << std::endl;
        break;
    }
}


Добавлено через 5 минут и 12 секунд
Цитата(chiffa @  27.4.2017,  15:26 Найти цитируемый пост)
80 в БИН это 10000000

нет
Цитата

80 в бин это 1010000

используй обычный калькулятор, там все есть.
PM   Вверх
chiffa
Дата 27.4.2017, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за ответ. Та я вообщем с калькулятором и конвертирую.... 80 в HEX - 1000 0000 DEC

Цитата(azesmcar @  27.4.2017,  15:48 Найти цитируемый пост)
делаешь операцию AND (&) с нужно тебе маской и получаешь результат.

а как понять какая маска мне нужна?....


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


uploading...
****


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

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



Цитата(chiffa @  27.4.2017,  16:03 Найти цитируемый пост)
80 в HEX - 1000 0000 DEC

а, в HEX? ну так и пиши 0x80.

Цитата(chiffa @  27.4.2017,  16:03 Найти цитируемый пост)
а как понять какая маска мне нужна?....

ну если тебе нужно получить первые два бита, то первые два бита 1, после все нули ну и в результате ты получишь значение первых двух битов (а остальное все нули).
PM   Вверх
chiffa
Дата 27.4.2017, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



то есть делаю на калькуляторе:

10000000 (0x80)
AND
11000000 (2 бита)
-------------
10000000 - результат

получает канал 1, а по примеру должен быть....
PM MAIL   Вверх
vpf
Дата 27.4.2017, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у вас в перовом посте ошибка,
биты считаются справа налево
7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0   0x80  это и есть канало 0  с типом 2 (биты 7,6 = 10)
PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
chiffa
Дата 27.4.2017, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



блин, точно с права налево....
но, есть пример с каналом 1, байт 0x41

получается:
1000001 - 0x41
AND
11000000 (2 бита)
-------------
1000000 - результат такой же....
PM MAIL   Вверх
azesmcar
Дата 27.4.2017, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



если тебе нужно получить последние два бита, то и маска должна быть соответствующей. я всего лишь пример показал.
PM   Вверх
chiffa
Дата 27.4.2017, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Фсе, до меня вроде дошло. Всем огромное спасибо за помощь и разъяснения smile
PM MAIL   Вверх
vpf
Дата 27.4.2017, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот так получается:
01000001 - 0x41
AND
11000000  - 0x30  маска   (на 2 бита)
01000000 = 0x40   результат 


Это сообщение отредактировал(а) vpf - 27.4.2017, 18:04
PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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