Да, это связано с порядком байтов. Первый байт в файле 0x4d
, второй байт 0x5a
. Когда вы печатаете их, используя %x
, они интерпретируются как порядковый номер с небольшим порядковым номером, поэтому байты меняются местами при печати. Рассмотрим в качестве отдельного примера следующую программу:
#include <cassert>
#include <cstdio>
int main()
{
assert(sizeof(unsigned) == 4);
char bytes[4] = { 0x12, 0x34, 0x56, 0x78 };
std::printf("%x\n", *reinterpret_cast<unsigned const*>(bytes));
}
В системе с порядком байтов с прямым порядком байтов вывод будет 78563412
. (В этом примере программа игнорирует потенциальные проблемы с выравниванием; поскольку вы используете Visual C ++, проблем не будет.)
Обратите внимание, что вы превышаете свое однобайтовое распределение (вы malloc(1)
, но читаете два байта).