Показать полную графическую версию : 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;
но, сами понимаете, некрасиво, нерационально :)
подскажите, как это покрасивше сделать?
Собирать байты в int imho логичнее через двоичный and, а не через сложение.
Код зато вполне переносимый получился - будет корректно работать на любой платформе.
Собирать байты в int », а зачем их нафиг в данном члучае собирать в int, что-за глюк я че-то не понял! в вопросе и содержится ответ byte stream в struct. читай прямо в струтуру не по одному байту а сразу весь ращзмер структуры.
typedef struct
{
WORD a, b;
DWORD c;
}somestuct
...
somestuct *data;
read( handle, data, sizeof(somestuct) ); // все поля заполнены
Это чтение из файла. Файл должен быть открыт в бинарном режиме.
batcom, это не у меня надо спрашивать, а у Arrest. Например, для того, чтобы потом не геморроиться с приведением типов в выражениях.
По поводу кода: садись, два!
1. Структура в памяти может храниться как упакованной, так и выровненной по длине машинного слова.
2. Порядок байтов в слове на разных платформах разный
#pragma pack(1) ???
Порядок байтов в слове на разных платформах разный »
#pragma pack(1)
typedef struct
{
unsigned char a[2], b[2], c[4];
}somestuct;
#pragma pack()
так то пойдет нет?
садись, два!»
Ну хотябы три...
массивы тоже выравниваются
теоретически, char может быть и 16-битным (хотя во всех известных реализациях он 8-битный)
кстати, код Arrest всё же непереносимый - в 16-битной системе int так же 16-битный
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.