LINUX.ORG.RU

Правильное считывание бинарных структур


0

1

Работаю с FAT, на данном этапе хочу просто считать BIOS PB структуру, и смотреть различные параметры ФС.

#include <stdio.h>
struct BIOSParameterBlock{
	char BS_jmpBoot[3];
	char BS_OEMName[8];
	unsigned short BPB_BytsPerSec;
	unsigned char BPB_SecPerClus;
	unsigned short BPB_RsvdSecCnt;
};
int main(int argc,char** argv){
	BIOSParameterBlock bios;
	FILE* device = fopen(argv[1],"rb");
	if(device == NULL){
		printf("Invalid device or image\n");
		return 1;
	}
	fread(&bios,1,20,device);
	printf("Device works well.\nOEM name:");
		for(int i=0;i<8;++i) printf("%c",bios.BS_OEMName[i]);
	printf("\nByts per sfector:%d\n",bios.BPB_BytsPerSec); //Пишет 16386, а надо 512
	fclose(device);
	return 0;
}

В спецификации указано, что BPB_BytsPerSec занимает 2 байта с 11 позиции. Если считывать это значение отдельно, а не структурой, то все работает хорошо.

ман выравнивание

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1) /* set alignment to 1 byte boundary */

struct MyPackedData
{
char Data1;
long Data2;
char Data3;
};

#pragma pack(pop)

anonymous
()

1) используй типы с фиксированной длиной 2) __attribute__((packed))

anonymous
()

вообще, лучше такие штуки читать/писать через fread/fwrite поэлементно. тогда железно будет работать и стопроцентно переносимо.

alegz ★★★★
()
Ответ на: комментарий от Chubakur

из-за выравнивания членов структуры, йопт.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.