Was sind in C-Sprache die am besten geeigneten Formatbezeichner für den Datentyp BYTE, WORD und DWORD, die mit den Funktionen printf und scanf verwendet werden? Es fällt mir schwer, die Werte des BPB-Feldes über der Konsole anzuzeigen.Formatbezeichner für Datentyp BYTE, WORD und DWORD in C-Sprache?
Zum Beispiel, wenn ich versuche, BPB_BytsPerSec mit „% lu“ anzuzeigen, ich ungewöhnlichsten Zahlen bin immer ..
printf("Bytes per Sector: %lu", b->BPB_BytsPerSec);
ich einen Wert von „514“ bekommen, was ich glaube, ist falsch Interpretation .. Bitte schlagen Sie den Ausweg vor. Vielen Dank.
(Ich bin mit gcc 5.1 über MinGW, die über einen 64-Bit-Windows)
Hier ist die Struktur, die wir reden:
/* BPB Structure Collected from internet */
struct BPB_FAT32 {
BYTE BS_jmpBoot[3]; // 0
BYTE BS_OEMName[8]; // 3
WORD BPB_BytsPerSec; // 11
BYTE BPB_SecPerClus; // 13
WORD BPB_ResvdSecCnt; // 14
BYTE BPB_NumFATs; // 16
WORD BPB_RootEntCnt; // 17
WORD BPB_TotSec16; // 19
BYTE BPB_Media; // 21
WORD BPB_FATSz16; // 22
WORD BPB_SecPerTrk; // 24
WORD BPB_NumHeads; // 26
DWORD BPB_HiddSec; // 28
DWORD BPB_TotSec32; // 32
DWORD BPB_FATSz32; // 36
WORD BPB_ExtFlags; // 40
WORD BPB_FSVer; // 42
DWORD BPB_RootClus; // 44
WORD BPB_FSInfo; // 48
WORD BPB_BkBootSec; // 50
BYTE BPB_Reserved[12]; // 52
BYTE BS_DrvNum; // 64
BYTE BS_Reserved1; // 65
BYTE BS_BootSig; // 66
DWORD BS_VolID; // 67
BYTE BS_VolLab[11]; // 71
BYTE BS_FilSysType[8]; // 82
};
Und die Funktion, durch die ich diese anzuzeigen versuche Werte ..
void DisplayBlock(struct BPB_FAT32* b){
printf("\n\n\t1. Jump to boot code..........: 0x%02x%02x%02x",b->BS_jmpBoot[0],b->BS_jmpBoot[1],b->BS_jmpBoot[2]);
printf("\n\n\t2. OEM name & version.........: "); for(int i=0; i<8;i++) printf("%c",(char)b->BS_OEMName[i]);
printf("\n\n\t3. Bytes per Sector...........: %u",b->BPB_BytsPerSec); // WORD
printf("\n\n\t4. Sectors per Cluster........: %lu", b->BPB_SecPerClus); // BYTE
printf("\n\n\t5. Reserved Sectors Count.....: %lu", b->BPB_ResvdSecCnt); // WORD
printf("\n\n\t6. Number of FAT32 tables.....: %u", b->BPB_NumFATs); // BYTE
printf("\n\n\t7. Number of Root Entries.....: %lu", b->BPB_RootEntCnt); // WORD
printf("\n\n\t8. Total Sectors 16bits.......: %lu",b->BPB_TotSec16); // WORD
printf("\n\n\t9. Media Descriptor...........: %lu",b->BPB_Media); // BYTE 0xF8 is the standard value for fixed media
printf("\n\n\t10. Size According to FAT16....: %lu",b->BPB_FATSz16); // WORD
printf("\n\n\t11. Number of Sector per Track.: %lu",b->BPB_SecPerTrk); // WORD
printf("\n\n\t12. Number of Heads............: %lu",b->BPB_NumHeads); // WORD
printf("\n\n\t13. Number of Hidden Sectors...: %lu", b->BPB_HiddSec); // DWORD
printf("\n\n\t14. Total Sectors 32bits.......: %lu", b->BPB_TotSec32); // DWORD
/* FAT32 Specific Fields Starting offset:36 */
printf("\n\n\t15. Size According to FAT32....: %lu", b->BPB_FATSz32); // DWORD
//printf("\n\n\t16. Extended Flags............: %u",b->BPB_ExtFlags); // WORD Usually 0.
printf("\n\n\t17. File System Version........: %lu", b->BPB_FSVer); // WORD Must be 0:0
printf("\n\n\t18. Root Cluster Number........: %lu",b->BPB_RootClus); // DWORD Usually 2
printf("\n\n\t19. File System Information....: %lu",b->BPB_FSInfo); // WORD
printf("\n\n\t20. Backup Boot Sector.........: %lu",b->BPB_BkBootSec); // WORD Recomended 6
// BYTE BPB_Reserved[12]
/* Remaining common fields FAT12/FAT16 BPB*/
printf("\n\n\t21. Drive Number...............: %u",b->BS_DrvNum); // BYTE
// BYTE BS_Reserved1; /* 65 reserved */
printf("\n\n\t22. Boot Signature.............: %u",b->BS_BootSig); // BYTE
printf("\n\n\t23. Volume ID..................: %lu",b->BS_VolID); // DWORD
printf("\n\n\t24. Volume Lable...............: %s",b->BS_VolLab); //for(int i=0;i<11;i++) printf("%c",b->BS_VolLab[i]); // BYTE [11]
printf("\n\n\t25. File System Type...........: "); for(int i=0;i<8;i++) printf("%c",b->BS_FilSysType[i]); // BYTE [8]
}
Und hier ist der unglückliche Ausgang:
Wie wäre es mit Gießen? 'printf ("% "PRIu16, (uint16_t) b-> BPB_BytsPerSec);' ('intttypes.h' für die Verwendung dieser Makros) – MikeCAT
BPB_BytsPerSec ist ein WORD (aka unsigned short). Integer-Heraufstufung macht es zu einem 32-Bit-Wert und * lang * ist sicher auch ein 32-Bit-Wert auf Ihrem Compiler, so dass% lu nicht fürchterlich falsch ist. Aber sicher, 514 kann nicht stimmen. Off-by-2 lässt keine vernünftige Vermutung darüber, wie das schief gelaufen ist. –
Warum 514 abgerufen wird: Wo ist lesen für 'b-> BPB_BytsPerSec' kann falsch sein oder es kann zusätzliche Auffüllung in der Struktur (es gibt 11 Bytes vor 'BPB_BytesPerSec' und was nach' BPB_BytesPerSec' ist' BPB_SecPerClus', die kann 2). – MikeCAT