Перейти к содержанию
    

Эффективно преобразовать эл-ты структуры в массив байт

Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет! Есть структура, которая содержит различные элементы, общая сумма которых 8 байт, нужно их отобразить в массив. Просто копировать нельзя, какие способы есть, чтобы структуры packed не использовать?

 

Я в своих программах поступаю так...

 

union _Union_Struct
{
   uint8_t Array[0x8];      // массив с данными структуры 

   struct _your_structure // структура
   {
.........................................
   }Your_Structure;
}Union_struct;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

zoddy, у меня элементы в структуре "растянуты" (я не использую packed структуры), т.е. размер суммы элементов структуры равен 8, а размер самой структуры в общем случае >=8, поэтому трюк с union не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну можно такой огород нагородить:

 

 

typedef struct 
{
   char a;
   wchar_t b;
   char c;
   int d;
}Your_Structure;

#pragma pack(push, 1)

typedef union 
{
   char Array[0x8];
   struct
   {
      char a;
      wchar_t b;
      char c;
      int d;
   }PS;
}Union_struct;
#pragma pack(pop)


int main(void)
{
   Union_struct aa;
   Your_Structure bb = {1, 2, 3, 4};

   aa.PS.a = bb.a;
   aa.PS.b = bb.b;
   aa.PS.c = bb.c;
   aa.PS.d = bb.d;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какие способы есть, чтобы структуры packed не использовать?
В общем случае задача не решается. Можно вручную создать по массиву описателей полей для каждого типа структур и по этому описателю упаковывать/распаковывать структуру во время обмена. Что-то вроде:
#include    <stddef.h>
#include    <stddef.h>

struct my_type
{
    uint8_t         Field_a;
    uint_fast8_t    Field_b;    // !!!
    uint16_t        Field_c;
    uint32_t        Field_d;   

};

struct field_descriptor
{
    uintptr_t   Offset;
    size_t      Size;
};

field_descriptor My_type_fields[] = 
{
    { offsetof(my_type, Field_a), 1 },
    { offsetof(my_type, Field_b), 1 },
    { offsetof(my_type, Field_c), 2 },
    { offsetof(my_type, Field_d), 4 },
};

Можно по аналогии с offsetof() написать макрос определения размера поля. Но он не подойдет для типов вроде uint_fast8_t, для них придется указывать вручную. Можно написать макрос, заполняющий оба поля field_descriptor. Простор для творчества.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...