Я категорически не согласен с идеей чтения байта за байтом. Если вы позаботитесь об упаковке структуры в объявлении структуры, вы можете скопировать в структуру без проблем. Для проблемы endiannes повторное чтение побайтно решает проблему, но не дает общего решения. Этот метод очень хромает. Я делал что-то подобное раньше для аналогичной работы, и все работало без сбоев.
Подумай об этом. У меня есть структура, у меня также есть соответствующее определение этой структуры. Вы можете создать это вручную, но я написал для этого парсер и использовал его и для других вещей.
Например, определение структуры, которую вы дали выше, это "s i s s". (s = short, i = int) Затем я передаю адрес структуры, это определение и опцию упаковки структуры этой структуры специальной функции, которая имеет дело с endiannes и вуаля, как это делается.
SwitchEndianToBig (& header, "s i s s", 4); // 4 = опция упаковки структуры