Преобразование структур big endian в little endian

Я составляю программу на языке Си, которая взаимодействует с монитором пациента, использующим упорядочивание байтов big endian. Например, если у меня есть некоторая структура на языке 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 правильный, но это только мое мнение, я не уверен во внутреннем устройстве упорядочивания байтов. Буду признателен за любую помощь.

Спасибо, Шивам Калра

5
задан Shivam 20 January 2012 в 00:18
поделиться