Для уточнения @ ответ TheBluefish, этот код имеет ошибку
// Read number of bytes used per pixel
int liczbaBitow;
plik.read((char*)&liczbaBitow, 2);
При использовании (char*)&libczbaBitow
, вы принимаете адрес 4 байта целое, и, говоря код поставить 2 байта там.
Остальные два байта этого целого числа являются неуказанными и неинициализированными. В этом случае они равны 0xCC
, потому что это значение инициализации стека, используемое системой.
Но если вы вызываете это из другой функции или повторно, вы можете ожидать, что стек будет содержать другие фиктивные значения.
Если вы инициализируете переменную, вы получите ожидаемое значение.
Но есть еще одна ошибка. Здесь также есть порядок байтов. Этот код предполагает, что собственный байтовый порядок машины точно соответствует порядку байтов из спецификации файла. Есть целый ряд различных растровых форматов, но с вашей ссылки, в статье Википедии говорит:
Все целых значений сохраняются в маленьком формате обратного порядка байт (то есть наименее значащий байт первый).
Это то же самое, что и у вас, что, очевидно, тоже x86 малое. Другие поля не определены как маленькие, так как вы приступаете к декодированию изображения, вам придется следить за ним.
В идеале вы читали в байтовый массив и помещали байты, в которых они принадлежат. См. Convert Little Endian to Big Endian
int libczbaBitow;
unsigned char bpp[2];
plik.read(bpp, 2);
libczbaBitow = bpp[0] | (bpp[1]<<8);
Необходимо показать, как файл был открыт.Был ли он открыт с использованием флага 'ios :: binary'? – PaulMcKenzie
Вы помещаете два байта в единичное (возможно, 4 байта) целое число. Попробуйте инициализировать 'liczbaBitow' до нуля в качестве первого шага. – Machtl
Формат [формат растрового файла] (https://msdn.microsoft.com/en-us/library/dd183391.aspx) ** слишком сложный **, чтобы написать собственный синтаксический анализатор. Используйте библиотеку, встроенную в вашу платформу, или стороннюю библиотеку. – IInspectable