Смещение и sizeof битового поля
От: Varavva  
Дата: 22.09.16 08:40
Оценка:
С сервера приходят пакеты данных следующей структуры

typedef struct s_tagDsDataPacket
{
    unsigned char    Code;                    
    unsigned short    SiteID;
    DS_TIME        Time;
    unsigned short    CraneNo;

    short            Load;                    
    unsigned short    Capacity;                
    short            HookRadius;                
    unsigned short    LuffAngle;                
    short            HookHeight;                
    unsigned short    SlewAngle;                
    unsigned short    WindSpeed    : 10;        
                                            
    unsigned short    WindDir        : 6;        

    unsigned long    IP;
    unsigned short    Fault;
    unsigned char    ACD;
    unsigned short    NB;
    unsigned long    AC;
    unsigned long    ERR;

    unsigned short    CRC;                    

}DS_DATAPACKET, *PDS_DATAPACKET;


Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir.
Компилятор ругается, что не может получить указатель для битовых полей. Как быть?
Re: Смещение и sizeof битового поля
От: _Butch_  
Дата: 22.09.16 08:47
Оценка: +1
typedef struct s_tagDsDataPacket
{
    unsigned char    Code;                    
    unsigned short    SiteID;
    DS_TIME        Time;
    unsigned short    CraneNo;

    short            Load;                    
    unsigned short    Capacity;                
    short            HookRadius;                
    unsigned short    LuffAngle;                
    short            HookHeight;                
    unsigned short    SlewAngle;    
            
        union
    {
        struct 
        {        
            unsigned short    WindSpeed    : 10;        
            unsigned short    WindDir        : 6;
        } Wind;
                unsigned short dummy;  
    } u;

    unsigned long    IP;
    unsigned short    Fault;
    unsigned char    ACD;
    unsigned short    NB;
    unsigned long    AC;
    unsigned long    ERR;

    unsigned short    CRC;                    

}DS_DATAPACKET, *PDS_DATAPACKET;
Отредактировано 22.09.2016 8:48 _Butch_ . Предыдущая версия .
Re[2]: Смещение и sizeof битового поля
От: Varavva  
Дата: 22.09.16 08:49
Оценка:
Здравствуйте, _Butch_, Вы писали:

Я не могу менять клиентский хидер.
Re: Смещение и sizeof битового поля
От: uzhas Ниоткуда  
Дата: 22.09.16 09:57
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir.

V>Компилятор ругается, что не может получить указатель для битовых полей. Как быть?

задачу уточните
указатель на битовое поле не имеет физического смысла
вы можете получить указатель на какое-либо поле рядом, например, SlewAngle, а там уже прыгать вперед\назад, если надо
Re[2]: Смещение и sizeof битового поля
От: Varavva  
Дата: 22.09.16 10:03
Оценка:
Здравствуйте, uzhas, Вы писали:

U>задачу уточните


Задача унифицировать структуры, приходящие с сервера, через XML описание. Чтобы пользователь без перекомпиляции приложения смог бы заданием XML менять понимание принимаемых данных
В XML описывается каждое поле структуры, с заданием размера и смещения от начала. Не понятно как задавать это для бытовых полей

U>указатель на битовое поле не имеет физического смысла


Почему? Данные есть в пакете? Есть. Значит есть и размер и сдвиг от начала.
Re: Смещение и sizeof битового поля
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 22.09.16 10:04
Оценка:
Здравствуйте, Varavva, Вы писали:

V>С сервера приходят пакеты данных следующей структуры


V>
V>typedef struct s_tagDsDataPacket
V>{
V>    unsigned char    Code;                    
V>    unsigned short    SiteID;
V>    DS_TIME        Time;
V>    unsigned short    CraneNo;

V>    short            Load;                    
V>    unsigned short    Capacity;                
V>    short            HookRadius;                
V>    unsigned short    LuffAngle;                
V>    short            HookHeight;                
V>    unsigned short    SlewAngle;                
V>    unsigned short    WindSpeed    : 10;        
                                            
V>    unsigned short    WindDir        : 6;        

V>    unsigned long    IP;
V>    unsigned short    Fault;
V>    unsigned char    ACD;
V>    unsigned short    NB;
V>    unsigned long    AC;
V>    unsigned long    ERR;

V>    unsigned short    CRC;                    

V>}DS_DATAPACKET, *PDS_DATAPACKET;

V>

Тут есть две проблемы — padding, alignment и обработка битовых полей компилятором. Это надо учитывать.
V>Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir.
Зачем? Тебе надо взять указатель на массив где этот пакет лежит и грубо сделать преобразование типов, а потом спокойно получать доступ к битовому полю стандартным способом.
V>Компилятор ругается, что не может получить указатель для битовых полей. Как быть?
Конечно, ведь битовое поле это фикция.
Sic luceat lux!
Re[3]: Смещение и sizeof битового поля
От: uzhas Ниоткуда  
Дата: 22.09.16 10:06
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Почему? Данные есть в пакете? Есть. Значит есть и размер и сдвиг от начала.


минимальная адресуемая величина с помощью указателя — байт
биты — это мельче, чем байт, поэтому их принципиально нельзя адресовать указателями

то же самое с размером. sizeof — это про байты. мельче не посчитать
Re[4]: Смещение и sizeof битового поля
От: Varavva  
Дата: 22.09.16 10:07
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Varavva, Вы писали:


V>>Почему? Данные есть в пакете? Есть. Значит есть и размер и сдвиг от начала.


U>минимальная адресуемая величина с помощью указателя — байт

U>биты — это мельче, чем байт, поэтому их принципиально нельзя адресовать указателями

U>то же самое с размером. sizeof — это про байты. мельче не посчитать


А, в этом смысле имеется ввиду. Это да, понятно.
Re[2]: Смещение и sizeof битового поля
От: Varavva  
Дата: 22.09.16 10:09
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Зачем? Тебе надо взять указатель на массив где этот пакет лежит и грубо сделать преобразование типов


Когда этот самый "тип" есть, то понятно. А когда идет рантаймная генерация типа структуры из XML — не понятно как быть.
Re[3]: Смещение и sizeof битового поля
От: uzhas Ниоткуда  
Дата: 22.09.16 10:24
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Здравствуйте, Kernan, Вы писали:


K>>Зачем? Тебе надо взять указатель на массив где этот пакет лежит и грубо сделать преобразование типов


V>Когда этот самый "тип" есть, то понятно. А когда идет рантаймная генерация типа структуры из XML — не понятно как быть.


ну можно пойти таким путем: на уровне xml поддержать битовую адресацию
то есть поле задается так:
[name, bitOffsetFromStart, bitSize]

как собрать эту статистику из имеющейся struct — отдельный вопрос. тут, возможно, внешняя тулза понадобиться или макросами что-то руками наваять под каждую структуру

если в рантайме кто-то пишет значения поля, то сначала проверяем, что можно байтовыми операциями отделаться, если не может, то уже с битами прыгаем
Re[3]: Смещение и sizeof битового поля
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 23.09.16 13:54
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Здравствуйте, Kernan, Вы писали:


K>>Зачем? Тебе надо взять указатель на массив где этот пакет лежит и грубо сделать преобразование типов


V>Когда этот самый "тип" есть, то понятно. А когда идет рантаймная генерация типа структуры из XML — не понятно как быть.

Момет таки компайл-тайм?
Sic luceat lux!
Re[4]: Смещение и sizeof битового поля
От: Varavva  
Дата: 23.09.16 13:55
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Момет таки компайл-тайм?


Нет, ран-тайм. Прога читает XML, получает void* и на основе XML расчухивает что там за данные.
Re: Смещение и sizeof битового поля
От: kov_serg Россия  
Дата: 23.09.16 23:25
Оценка:
Здравствуйте, Varavva, Вы писали:

...
V>
V>typedef struct s_tagDsDataPacket
V>{
V>    unsigned char    Code;                    
V>    unsigned short    SiteID;
V>    DS_TIME        Time;
V>    unsigned short    CraneNo;

V>    short            Load;                    
V>    unsigned short    Capacity;                
V>    short            HookRadius;                
V>    unsigned short    LuffAngle;                
V>    short            HookHeight;                
V>    unsigned short    SlewAngle;                
V>    unsigned short    WindSpeed    : 10;        
                                            
V>    unsigned short    WindDir        : 6;        

V>    unsigned long    IP;
V>    unsigned short    Fault;
V>    unsigned char    ACD;
V>    unsigned short    NB;
V>    unsigned long    AC;
V>    unsigned long    ERR;

V>    unsigned short    CRC;                    

V>}DS_DATAPACKET, *PDS_DATAPACKET;

V>


V>Мне нужно получить sizeof и смещение относительно начала структуры полей WindSpeed и WindDir.

V>Компилятор ругается, что не может получить указатель для битовых полей. Как быть?

V>Я не могу менять клиентский хидер.

Заведите дополнительный хидер.

Сделайте функцию упаковки и распаковки пакета в структуру с которой приятно работать.
Или просто заведите нужные себе константы в зависимости от выравнивания и платформы
enum {
  DS_DATAPACKET_WindSpeed_Offset=19, DS_DATAPACKET_WindSpeed_Size=2, DS_DATAPACKET_WindSpeed_Mask=0x03FF,DS_DATAPACKET_WindSpeed_Shift=0,
  DS_DATAPACKET_WindDir_Offset=19,   DS_DATAPACKET_WindDir_Size=2,   DS_DATAPACKET_WindDir_Mask=0xFC00,  DS_DATAPACKET_WindDir_Shift=10
};
Re: Смещение и sizeof битового поля
От: Pavel Dvorkin Россия  
Дата: 25.09.16 09:13
Оценка:
Здравствуйте, Varavva, Вы писали:

V>С сервера приходят пакеты данных следующей структуры


В предположении, что все члены выровнены на 1 байт

int ofsettWindSpeed = offsetof(DS_DATAPACKET, SlewAngle) + sizeof(unsigned short);

А насчет битов — это ИМХО в стандарте не определено, в каком порядке они считаются (слева направо или наоборот)
With best regards
Pavel Dvorkin
Re[3]: Смещение и sizeof битового поля
От: Cruser Украина  
Дата: 26.09.16 07:42
Оценка:
V>В XML описывается каждое поле структуры, с заданием размера и смещения от начала. Не понятно как задавать это для бытовых полей

Раз есть невыровненные по байту поля, то задавайте смещение в битах от начала, а не в байтах.
Re[3]: Смещение и sizeof битового поля
От: alpha21264 СССР  
Дата: 26.09.16 15:55
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Здравствуйте, _Butch_, Вы писали:


V>Я не могу менять клиентский хидер.


Напиши свой такой-же.

Течёт вода Кубань-реки куда велят большевики.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.