Я делаю программу на C, которая связывается с монитором пациента, использующим порядок байтов с прямым порядком байтов. Например, если у меня есть определенная структура C
typedef struct {
int short a;
int short b;
int c;
} msg;
Чтобы прочитать такую структуру, я могу просто использовать ntohs (msg.a), ntohs (msg.b), ntohl (msg.c). Но некоторые структуры имеют буфер с короткими целыми числами, но сам этот буфер является типом другой структуры. Например,
typedef struct {
int short length;
int short b[MAX_BUF_SIZE];
} msg1;
Поле "b" в вышеприведенной структуре представляет другую структуру, которая находится ниже:
typedef struct {
int short a;
int short b;
} msg2;
Теперь мой вопрос: 1) я должен преобразовать все короткие целые числа структуры "msg1" в порядок хостов, а затем привести его к указателю типа "msg2" и просто прочитать "msg2.a" и "msg2.b" или 2) я должен преобразовать порядок байтов в "msg2.a" и "msg2.b", а также 3) просто приведение
msg1.b указывает на указатель типа msg2 и считывает msg2.a и msg2.b, преобразовывая каждый из них в порядок хостов?
Пожалуйста, скажите, какой из подходов корректен для чтения msg1
ПОДХОД 1
int t[msg1.length];
for(int i = 0; i < msg1.length; i++)
t[i] = ntohs(*(msg1.b + i));
msg2 * msg2_m = (msg2 *)t;
/* should I convert the msg2_m.a and msg2_m.b as well? */
printf("%d:%d", msg2_m.a, msg2_m.b);
ПОДХОД 2
Все то же самое, кроме
printf("%d:%d", ntohs(msg2_m.a), ntohs(msg2_m.b));
ПОДХОД 3
Не преобразовывать msg1.b и напрямую приводить msg1.b к msg2, а просто преобразовывать msg2.a и msg2.b в порядок хостов.
msg2 *msg2_m = (msg2 *)msg1.a;
printf("%d:%d", ntohs(msg2_m.a), ntohs(msg2_m.b));
Мне нужно понять, когда структура приводится к некоторым другим структурам, меняется ли ее порядок байтов в соответствии с новой структурой при передаче по сети? Я думаю, что APPROACH 3 правильный, но это только я, я не уверен насчет внутренних элементов порядка байтов. Любая помощь будет оценена.
Спасибо,
Шивам Калра