Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   byte stream в struct? (http://forum.oszone.net/showthread.php?t=111463)

Arrest 15-07-2008 00:07 851545

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

int another_byte;
int result;
result = byte_heap[0];
another_byte = byte_heap[1];
another_byte = another_byte << 8;
result += another_byte;
structure.field1 = result;

но, сами понимаете, некрасиво, нерационально :)
подскажите, как это покрасивше сделать?

Busla 15-07-2008 11:29 851867

Собирать байты в int imho логичнее через двоичный and, а не через сложение.
Код зато вполне переносимый получился - будет корректно работать на любой платформе.

batcom 15-07-2008 12:06 851900

Цитата:

Цитата Busla
Собирать байты в int »

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

typedef struct 
 
{
  
WORD ab;
  
DWORD c;
 }
somestuct
...
 
somestuct *data;
 
read(  handledatasizeof(somestuct) ); // все поля заполнены 

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

Busla 15-07-2008 14:24 852037

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

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

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

batcom 15-07-2008 14:41 852057

#pragma pack(1) ???
Цитата:

Цитата Busla
Порядок байтов в слове на разных платформах разный »

PHP код:

#pragma pack(1) 
typedef struct  
 

  
unsigned char a[2], b[2], c[4]; 
 }
somestuct;
#pragma pack() 

так то пойдет нет?
Цитата:

Цитата Busla
садись, два!»

Ну хотябы три...

Busla 15-07-2008 15:22 852093

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


Время: 05:24.

Время: 05:24.
© OSzone.net 2001-