Форум программистов, компьютерный форум CyberForum.ru

Побитовые операции msb и lsb - C++

Восстановить пароль Регистрация
 
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
11.02.2014, 18:07     Побитовые операции msb и lsb #1
Доброго дня,

подскажите пожалуйста, как можно справиться со следующей задачей:

есть некоторое сообщение, которое летает по CAN шине, примерно следующего формата:

121.112160___2___FD___Rxd___8___ 0D D2 1F 80 98 0B 00 00.

Мне в нем интересны 4 и 5 байты, с соответствующими значениями 0x98 и 0x0B. Эти два байта характеризует один из параметров.

Так как в 47 бите определени msb, а в 32 lsb, сообщение читаем справо налево и имеем значение параметра: 0x0B98.

Как можно организовать подобного рода конвертацию?

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct tCData
{
    struct tData
    {
        int     Id;             
        int     Length;          
        int     Reserved;        
        int     Flags;         
        int     Reserved;       
        int     Reserved;       
        int     Data[8];        //data field
    };
};
 
int main()
{
    tCData::tData* pDataField = new tCData::tData;
    pDataField->Data[4]=0x98;
    pDataField->Data[5]=0x0B;
 
    delete pDataField;
    return 0;
}
Добавлено через 48 минут
мой примитивный вариат, после недолгих раздумий, со вставкой inline assembler:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;
struct tCData
{
    struct tData
    {
        int     Id;             
        int     Length;          
        int     Reserved;        
        int     Flags;                 
        int     Data[8];        //data field
    };
};
 
int main()
{
    unsigned char  r1, r2;
    short result=NULL;
 
    tCData::tData* pDataField = new tCData::tData;
    pDataField->Data[4]=0x98;
    pDataField->Data[5]=0x0B;
    r1=pDataField->Data[4];
    r2=pDataField->Data[5];
 
    __asm
 
    {
        mov ah,    r2
        mov al,     r1
        mov result,ax
    }
 
    cout<<result<<endl;
 
    delete pDataField;
    system ("pause");
    return 0;
}
Проблема в том, что мне нужна конвертация в 64 битной рабочей среде, а inline assembler в ней не пашет...
Есть иные идеи?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2014, 18:07     Побитовые операции msb и lsb
Посмотрите здесь:

побитовые операции C++
C++ Побитовые операции
побитовые операции C++
C++ Побитовые операции
Побитовые операции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.02.2014, 20:42     Побитовые операции msb и lsb #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
вроде так
C++
1
result = (pDataFIeld->Data[5] << CHAR_BIT) | pDataField->Data[4];
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
11.02.2014, 21:54  [ТС]     Побитовые операции msb и lsb #3
Огромнейшее спасибо В точку Как раз то, что и было нужно и над чем полдня голова думала

Добавлено через 1 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
вроде так
C++
1
result = (pDataFIeld->Data[5] << CHAR_BIT) | pDataField->Data[4];
Огромнейшее спасибо. Прямо в точку. Как раз то, что и было нужно и над чем полдня голова думала
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,053
11.02.2014, 21:58     Побитовые операции msb и lsb #4
Цитата Сообщение от ustus_alex Посмотреть сообщение
Так как в 47 бите определени msb, а в 32 lsb,
не понятно переведи
Цитата Сообщение от ustus_alex Посмотреть сообщение
с соответствующими значениями 0x98 и 0x0B
Цитата Сообщение от ustus_alex Посмотреть сообщение
справо налево и имеем значение параметра: 0x0B98.
это штатный режим процессоров интел, в отличии от например моторолы
приведи к шорту
а если записываешь побайтно то может тебе unuon подойдет

C++
1
2
3
4
5
union
{
 unsigned char bt[2];
 unsigned short sh;
}
записываешь как байты в bt считываешь как короткое целое из sh
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
11.02.2014, 23:31  [ТС]     Побитовые операции msb и lsb #5
Цитата Сообщение от ValeryS Посмотреть сообщение
не понятно переведи
4 байт 0x98 -______1001 1000 <-lsb - младший бит в 32 бите 64 битного сообщения
5 байт 0x0B - msb-> 0000 1001_____- старший бит в 47 бите 64 битного сообщения

с 32 бита по 47 бит было закодировано значение одного из параметров (переменной)

итог: 0000 1001 1001 1000 = 2968(decimal)

И, спасибо, вопрос, уже был решен, простым битовым сдвигом и побитным ИЛИ.
Для записи мне десятичное декодированое значение было нужно получить, чтобы передать его на последующую обработку.
В конкретно этом примере в качестве параметра выступила скорость автомобиля через 121.112160 секунд, после запуска двигателя. И, составила она 29,68 км/час.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,053
11.02.2014, 23:45     Побитовые операции msb и lsb #6
Цитата Сообщение от ustus_alex Посмотреть сообщение
И, спасибо, вопрос, уже был решен, простым битовым сдвигом и побитным ИЛИ.
так не нужен он
вот так можно
short *a =(short*) &arr[4];
я понимаю если бы у тебя были мотороловские записи старший бит по младшему адресу
а у тебя чисто интеловские младший бит по младшему адресу
простое приведение
а если хочешь нормально работать то можно и массив к структуре привести
а можно и union
мне они, например, больше нравятся
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
12.02.2014, 00:22  [ТС]     Побитовые операции msb и lsb #7
А, какой из всех приведенных способов является наименее затратным с точки зрения произоводительности, т.е. наиболее эффективным?
Если подобное декодирование происходит в режиме условного real-time (сообщение пришло по CAN-шине на ПК, обработалось, передалось с корректировкой к следующему узлу по САN, сохранилось в log).
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,053
12.02.2014, 00:34     Побитовые операции msb и lsb #8
Цитата Сообщение от ustus_alex Посмотреть сообщение
А, какой из всех приведенных способов является наименее затратным с точки зрения произоводительности, т.е. наиболее эффективным?
Цитата Сообщение от ValeryS Посмотреть сообщение
union
поскольку это одни и те же данные просто обращаешься к ним по разному
они ни как не модифицируются не переписываются ......
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct abc
{
 int a;
 int b;
 int c;
}
union xz
{
 unsigned char bt[12];
 abc  st_abc;
}
........................
xz u_xz;
//записываем как байты
 
for(int i=0;i<12;i++)
  u_xz.bt[i]=i;
// считываем как поля структуры
printf( " %d %d %d",u_xz.st_abc.a,u_xz.st_abc.b,u_xz.st_abc.c);
Цитата Сообщение от ustus_alex Посмотреть сообщение
сообщение пришло по CAN-шине на ПК, обработалось, передалось с корректировкой к следующему узлу по САN, сохранилось в log
вот для этого самое милое дело
на втором месте указатели с приведением,придется потратится на выделение переменных и взятие адреса
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2014, 00:59     Побитовые операции msb и lsb
Еще ссылки по теме:

C++ побитовые операции
C++ Побитовые операции
C++ Побитовые операции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
12.02.2014, 00:59  [ТС]     Побитовые операции msb и lsb #9
Спасибо, завтра попробую в боевой среде своей триклятой sdk досконально изучить предложенный Вами способ. Во всяком случае, идея мне понравилась, а в силу тягости к экспериментам, я ей обязательно займусь
Yandex
Объявления
12.02.2014, 00:59     Побитовые операции msb и lsb
Ответ Создать тему
Опции темы

Текущее время: 09:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru