подскажите пожалуйста как в ANSI C можно объявить структуру что бы одно поле была грантированно 16 бит другое 32 бита
конечная цель кроссплатформенно считать данные из буффера, где каждый элемент данныъ имеет фиксированный размер 16/32 бита
Здравствуйте, 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).
Здравствуйте, 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);
}