Добро пожаловать в переполнение стека! Вы сталкиваетесь с главной заглушкой нового программиста, называемой little endian .
Что это означает по существу, так это то, что ваши байты будут в обратном порядке по сравнению с тем, который вы ожидать, когда вы читаете некоторые значения как целое число. Я думаю, что тебя тоже может сбить с толку. Чтобы прочитать только два байта, ваш вызов fread должен быть похож на:
fread(&n,1,2,fptr);
Третий аргумент для fread - это количество «элементов» для чтения, а второй аргумент - это размер каждого элемент. Так что этот вызов fread будет читать два элемента, каждый размером 1 - два байта.
Пример программы, которая может сделать то, что вы просите для заголовка DOS (кстати, 4D5A в большом endian) может быть:
short magic;
FILE* fptr;
if ((fptr = fopen("Easy Keygen.exe","rb")) == NULL)
{
printf("error!");
}
fread(&magic,1,2,fptr);
printf("magic value was 0x%x\n",magic);
Этот должен распечатать, что значение magi c равно 0x5a4d . Опять же - байты будут обратными, потому что целые числа (и указатели тоже) интерпретируются в обратном порядке . Чтобы действительно подтвердить ваш чек, вам нужно сравнить его с 0x5a4d, а НЕ с 0x4d5a.
Надеюсь, это поможет!