C/C++ - byte stream в struct?

Ответить
Аватара пользователя
Arrest

C/C++ - byte stream в struct?

Сообщение Arrest »

Понимаю, что мой вопрос явно ламерский, но все же. У меня есть свежеполученная откуда-нибудь куча байтов, которую надо разместить в struct: первые два байта в первое поле структуры, вторые два байта - во второе поле структуры, следующие 4 байта - в третье поле... вопрос: как это сделать наиболее рационально и красиво? додумался до такого:



Код:

Код: Выделить всё

int another_byte;
int result;
result = byte_heap[0];
another_byte = byte_heap[1];
another_byte = another_byte 

но, сами понимаете, некрасиво, нерационально Изображение

подскажите, как это покрасивше сделать?
Аватара пользователя
Busla

Re: C/C++ - byte stream в struct?

Сообщение Busla »

Собирать байты в int imho логичнее через двоичный and, а не через сложение.

Код зато вполне переносимый получился - будет корректно работать на любой платформе.
Аватара пользователя
Busla

Re: C/C++ - byte stream в struct?

Сообщение Busla »

Цитата Busla:



Собирать байты в int
C/C++ - byte stream в struct?




, а зачем их нафиг в данном члучае собирать в int, что-за глюк я че-то не понял! в вопросе и содержится ответ byte stream в struct. читай прямо в струтуру не по одному байту а сразу весь ращзмер структуры.



PHP код:

Код: Выделить всё

typedef struct 

 {

  WORD a, b;

  DWORD c;

 }somestuct

...

 somestuct *data;

 read(  handle, data, sizeof(somestuct) ); // все поля заполнены 






Это чтение из файла. Файл должен быть открыт в бинарном режиме.
Аватара пользователя
Busla

Re: C/C++ - byte stream в struct?

Сообщение Busla »

batcom, это не у меня надо спрашивать, а у Arrest. Например, для того, чтобы потом не геморроиться с приведением типов в выражениях.



По поводу кода: садись, два!



1. Структура в памяти может храниться как упакованной, так и выровненной по длине машинного слова.

2. Порядок байтов в слове на разных платформах разный
Аватара пользователя
batcom

Re: C/C++ - byte stream в struct?

Сообщение batcom »

#pragma pack(1) ???


Цитата Busla:



Порядок байтов в слове на разных платформах разный
C/C++ - byte stream в struct?






PHP код:

Код: Выделить всё

#pragma pack(1) 

typedef struct  

 { 

  unsigned char a[2], b[2], c[4]; 

 }somestuct;

#pragma pack() 






так то пойдет нет?


Цитата Busla:



садись, два!
C/C++ - byte stream в struct?




Ну хотябы три...
Аватара пользователя
Busla

Re: C/C++ - byte stream в struct?

Сообщение Busla »

массивы тоже выравниваются

теоретически, char может быть и 16-битным (хотя во всех известных реализациях он 8-битный)

кстати, код Arrest всё же непереносимый - в 16-битной системе int так же 16-битный
Ответить

Вернуться в «Программирование и базы данных»