Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Протокол общения. Помогите с битами-байтами


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

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

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

Автор: azesmcar 27.4.2017, 15:48
Цитата(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

используй обычный калькулятор, там все есть.

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

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

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


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

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

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

ну если тебе нужно получить первые два бита, то первые два бита 1, после все нули ну и в результате ты получишь значение первых двух битов (а остальное все нули).

Автор: chiffa 27.4.2017, 17:14
то есть делаю на калькуляторе:

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

получает канал 1, а по примеру должен быть....

Автор: vpf 27.4.2017, 17:25
у вас в перовом посте ошибка,
биты считаются справа налево
7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0   0x80  это и есть канало 0  с типом 2 (биты 7,6 = 10)

Автор: chiffa 27.4.2017, 17:36
блин, точно с права налево....
но, есть пример с каналом 1, байт 0x41

получается:
1000001 - 0x41
AND
11000000 (2 бита)
-------------
1000000 - результат такой же....

Автор: azesmcar 27.4.2017, 17:39
если тебе нужно получить последние два бита, то и маска должна быть соответствующей. я всего лишь пример показал.

Автор: chiffa 27.4.2017, 18:00
Фсе, до меня вроде дошло. Всем огромное спасибо за помощь и разъяснения smile

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)