как объявить структуру в Си
От: sergey2b ЮАР  
Дата: 03.08.13 05:32
Оценка:
подскажите пожалуйста как в ANSI C можно объявить структуру что бы одно поле была грантированно 16 бит другое 32 бита
конечная цель кроссплатформенно считать данные из буффера, где каждый элемент данныъ имеет фиксированный размер 16/32 бита
Re: как объявить структуру в Си
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 03.08.13 05:38
Оценка: 6 (1)
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста как в ANSI C можно объявить структуру что бы одно поле была грантированно 16 бит другое 32 бита

S>конечная цель кроссплатформенно считать данные из буффера, где каждый элемент данныъ имеет фиксированный размер 16/32 бита

Именно в ANSI — никак. Только читать как 4-октетный массив (в общем случае даже не 4-байтовый!) и декодировать посимвольно.

Но если целевая область ограничена компиляторами Microsoft C, Intel C, GCC, Clang и т.п. — то достаточно #pragma pack(push,1) перед определением структуры (и #pragma pack(pop) после этого).

Учтите ещё проблему endianness (порядка байтов), и использования подходящих типов данных (таких, как int32_t, uint16_t).
The God is real, unless declared integer.
Re: как объявить структуру в Си
От: kov_serg Россия  
Дата: 06.08.13 21:27
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста как в ANSI C можно объявить структуру что бы одно поле была грантированно 16 бит другое 32 бита

S>конечная цель кроссплатформенно считать данные из буффера, где каждый элемент данныъ имеет фиксированный размер 16/32 бита

Очень просто не объявляй структуру а серализуй её.
Идея примерно такая:
typedef struct {
  unsigned char* data;
  int pos, lim, ovf, network_order, store;
} stream_io_t;
...
void stream_io_int(stream_io_t* s,int *v,int n) {
  int i,x;
  x=s->store ? *v : 0;
  if (s->network_order) { // m68k...
    for(i=0;i<n;++i) {
      if (s->pos >= s->lim) { s->ovf=1; break; }
      if (s->store) { s->data[s->pos++]=x&0xFF; x>>=8; }
      else { x|=s->data[s->pos++]<<(i*8); }
    }
  } else {
    for(i=n-1;i>=0;--i) { // x86...
      if (s->pos >= s->lim) { s->ovf=1; break; }
      if (s->store) { s->data[s->pos++]=(x>>(i*8))&0xFF; }
      else { x<<=8; x|=s->data[s->pos++]; }
    }
  }
  if (!s->store) *v=x;
}
...
typedef struct {
  int x, y;
} my_struct_t;
...
void my_struct_io(stream_io_t* stream, my_struct_t *s) {
  stream_io_int(stream,&s->x,2);
  stream_io_int(stream,&s->y,4);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.