• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Опять про Struct

  • Автор темы debug
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

debug

Ниже я задавал подобный вопрос - незнание это плохо - но не нашёл ответов на следующий вопрос:
Имеется код:
Код:
struct SIGNAL_STATUS {
char status_t;
unsigned short gNumber;
unsigned char sNumber;
unsigned short info;
unsigned short panel;
};

char temp[16];
memset(temp, 0, 16);
temp[0]=0x14;
temp[1]=0;
temp[2]=0x01;
temp[3]=0x01;
temp[4]=0;
temp[5]=0;
temp[6]=0;
temp[7]=0x01;
SIGNAL_STATUS *sg=(SIGNAL_STATUS*)temp;
sg->status_t;
sg->gNumber;
sg->sNumber;
sg->info;
sg->panel;

Резхультаты к сожалению не ожидаемые мной.
Что я ожидал:
sg->status_t=0x14
sg->gNumber=0x0001
sg->cNumber=0x01
sg->info=0x0000
sg->panel=0x0001

что получаеться на самом деле:
sg->status_t=0x14
sg->gNumber=257
sg->cNumber=0
sg->info=256
sg->panel=..

Могу конечно ошибиться - но факт тот - что результат сильно отличается от ожидаемого.
Что здесь может быть - выравнивание или сетевой порядок байт (похоже чем то), хотя думаю последнее тут не причём.
 
D

debug

Немного разобрался с выравниванием - как мне ответили в предыдущем вопросе - объявил так
Код:
#pragma pack(push,1)
struct SIGNAL_STATUS {
char status_t;
unsigned short gNumber;
unsigned char sNumber;
unsigned short info;
unsigned short panel;
};
#pragma pack(pop)

Результат после этого стал таким (в предыдущем примере)
sg->status_t=0x14
sg->gNumber=256
sg->cNumber=1
sg->info=0
sg->panel=256

Вижу - что переменные структуры типа short видимо хранятся в памяти в обратном порядке байт.
Почему - если я заполняю памать прямо, так видимо храняться переменные целых типов в памяти?
И ещё вопрос - как избежать этого выравнивания по другому - я с такими проблемами ещё не встречался :) - очч неприятная вещь.
 
G

grigsoft

Избежать - опцией компилятора выравнивать всегда по 1 байту. А по порядку байт - почитай где нибудь про органицацию памяти в x86.

 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!